Aizu - GRL_1_C Shortest Path - All Pairs Shortest Path(最短路 floyd)
阿新 • • 發佈:2018-11-10
題意:給出n個點m條路,求是否存在負環;不存在的輸出點之間的距離;
注意:會超int,要用long long 型;
判斷負環:floyd迴圈完一遍,如果存在dis[i][i]<0,證明存在負環;
#include <iostream> #include <cstdio> #include <cstring> #include <map> #include <algorithm> using namespace std; typedef long long ll; const ll INF = 0x3f3f3f3f3f3f3f3f;//注意資料型別,部分資料超int了 ll dis[150][150]; int main() { int n,m; while(cin>>n>>m){ for(int i = 0;i < n;i++) for(int j = 0;j < n;j++) if(i == j) dis[i][j] = 0; else dis[i][j] = INF;//初始化dis陣列 int a,b,c; while(m--){ cin>>a>>b>>c; dis[a][b] = c;//沒有重邊,直接輸入就好 } for(int k = 0;k < n;k++) for(int i = 0;i < n;i++){ if(dis[i][k] == INF) continue; //注意判斷一下,因為存在負邊,進入迴圈,有可能變成比INF小,會影響最終的判斷 for(int j = 0;j < n;j++){ if(dis[k][j] == INF) continue; dis[i][j] = min(dis[i][k] + dis[k][j],dis[i][j]); } } int flag = 0; for(int i = 0;i < n;i++) if(dis[i][i]<0){//floyd迴圈一邊過後,如果dis[i][i]<0,則證明存在負環 flag = 1; break; } if(flag) cout<<"NEGATIVE CYCLE"<<endl; else{ for(int i = 0;i < n;i++){ for(int j = 0;j < n;j++){ if(dis[i][j] == INF) cout<<"INF"<<(j==n-1?'\n':' '); //注意輸出格式,行末無空格 else cout<<dis[i][j] <<(j==n-1?'\n':' '); } } } } return 0; }