给定一个有向图,求1到n的最短路径。
需要可以判断图中是否有负环。
给定一个有向图,求1到n的最短路径。
需要可以判断图中是否有负环。
第一行两个整数n和m,表示点数和边数。,
。
接下来m行,每行3个整数,表示一条有向边。
如果图中有负环,输出circle
如果没有负环,但是从1无法到达n,输出 can't arrive
否则输出 1到n的最短距离
3 3 1 3 3 1 2 1 2 3 1
2
3 3 1 2 1 2 1 -2 2 3 1
circle
3 2 1 2 1 2 1 1
can't arrive!
#include<iostream> #include<vector> using namespace std; int inf=1e9; int inline read(){ int x = 0, f = 1; char c = getchar(); while(c < '0' || c > '9'){ if(c == '-'){ f = -1; } c = getchar(); } while(c >= '0' && c <= '9'){ x = x*10+c-'0'; c = getchar(); } return x*f; } int n,m,l,r,w; vector<int>Map(201); struct edge{ int from; int to; int weight; }; vector<edge>E; bool BF(){ for(int i=0;i<n;i++){ bool flag=false; for(int j=0;j<m;j++){ if(Map[E[j].to]>Map[E[j].from]+E[j].weight){ flag=true; Map[E[j].to]=Map[E[j].from]+E[j].weight; } } if(!flag)return false; } for(int j=0;j<m;j++){ if(Map[E[j].to]>Map[E[j].from]+E[j].weight){ return true; } } return false; } int main() { n=read(); m=read(); for(int i=1;i<=n;i++){ Map[i]=inf; } Map[1]=0; for(int i=0;i<m;i++){ l=read(); r=read(); w=read(); E.push_back({l,r,w}); } if(BF()){ printf("circle\n"); return 0; } if(Map[n]==inf){ printf("can't arrive!\n"); return 0; } printf("%d\n",Map[n]); return 0; }