All Pairs Shortest Path

链接:https://vjudge.net/problem/Aizu-GRL_1_C
思路:通过弗洛伊德算法,三重循环:d[k][j] = min(d[k][j],d[k][i] + d[i][j])更新出所有点的最短距离,若是存在封闭环的加权值为负数,则二维数组中d[i][i]中必然存在负值,所以只需单独判断是否存在负值,从而可以确定是否存在封闭环加权值为负数的情况.

代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<climits>
using namespace std;

static const int MAX = 100;
static const long long INFTY = (1LL<<32);

int n;
long long d[MAX][MAX];

void floyd(){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
if(d[j][i]==INFTY)continue;
for(int k=0;k<n;k++){
if(d[i][k]==INFTY)continue;
d[j][k] = min(d[j][k],d[j][i]+d[i][k]);//弗洛伊德算法核心
}
}
}

int main(){
int times,a,b,now;

cin>>n>>times;
for(int i=0;i<n;i++)//初始化整个数组,将起点和终点相同的数组对应的值设为0
for(int j=0;j<n;j++){
if(i==j)d[i][j] = 0;
else d[i][j] = INFTY;
}

while(times--){
cin>>a>>b>>now;
d[a][b] = now;
}
floyd();

bool negative = false;

for(int i=0;i<n;i++)//判断是否存在加权值为负数的封闭环
if(d[i][i]<0)negative = true;
if(negative)cout<<"NEGATIVE CYCLE"<<endl;

else{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j)cout<<" ";
if(d[i][j]==INFTY)cout<<"INF";
else cout<<d[i][j];
}
cout<<endl;
}
}
return 0;
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 6,161评论 0 2
  • 树形动态规划,顾名思义就是树+DP,先分别回顾一下基本内容吧:动态规划:问题可以分解成若干相互联系的阶段,在每一个...
    Mr_chong阅读 5,370评论 0 2
  • 计算机二级C语言上机题库(南开版) 1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平...
    MrSunbeam阅读 11,530评论 1 42
  • 2003年10月份,大四第一学期,第一场校园招聘,第一份简历,就把自己锁定在富士康,这一锁定就已过了13年了。坦...
    云沐妈妈阅读 1,540评论 0 0
  • 有时候自己的矫情劲一上来,真的是深夜不眠。深夜无聊翻胡楚靓微博时看到了她闺密的微博,里面记录着她从大学到毕业工作的...
    歆曼阅读 5,092评论 0 2