输出
−
1
-1
−1的情况就是当有正环。肯定使用SPFA,记录一个cnt数组保存每个节点入队次数,若
c
n
t
i
>
n
cnt_{i} > n
cnti>n,说明有正环。
代码:(SPFA版)
# include<iostream># include<cstdio># include<queue>usingnamespace std ;struct Edge{int to , next , w ;} g[1005];int d , p , c , f , s ;int fte[225], gsz , cnt[225];voidaddedge(int x ,int y ,int z ){
g[++ gsz]=( Edge ){ y , fte[x], z };
fte[x]= gsz ;}int dis[225];bool already[225];
queue <int> q ;boolspfa(int s ){for(int i =1; i <= c ; i++)
dis[c]=-1e9, already[i]=false;
dis[s]= d ;
already[s]=1;
q.push( s );while(! q.empty()){int x = q.front();
cnt[x]++;if( cnt[x]> c )returnfalse;
already[x]=0;
q.pop();for(int i = fte[x]; i ; i = g[i].next ){int y = g[i].to ;if( dis[x]+ g[i].w <= dis[y])//注意,这里要改成大于才改,小于等于不改continue;
dis[y]= dis[x]+ g[i].w ;if( already[y])continue;
already[y]=1;
q.push( y );}}returntrue;}intmain(){scanf("%d%d%d%d%d",&d ,&p ,&c ,&f ,&s);for(int i =1; i <= p ; i++){int x , y ;scanf("%d%d",&x ,&y);addedge( x , y , d );}for(int i =1; i <= f ; i++){int x , y , w ;scanf("%d%d%d",&x ,&y ,&w);addedge( x , y , d - w );}if(!spfa( s )){puts("-1");return0;}int ans =-1e9;for(int i =1; i <= c ; i++)
ans =max( ans , dis[i]);printf("%d\n", ans);return0;}