本题需要注意的是,起点不一定是从1开始,在初始化的时候也需注意。
#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <math.h> #define Min(a,b) a<b?a:b #define Max(a,b) a<b?b:a #define M 105*5 #define INF 999999999 using namespace std; int n,m; int k,s; double dis[M]; double v; struct Edge { int from,to; double R; double C; }; struct Edge edge[M]; bool Bellman_Ford() { int i,j; for(i=1;i<M;i++) { dis[i]=0; } dis[s]=v; bool flag; for(i=1;i<n;i++) { flag=false; for(j=1;j<=k;j++) { if(dis[edge[j].to]<(dis[edge[j].from]-edge[j].C)*edge[j].R) { dis[edge[j].to]=(dis[edge[j].from]-edge[j].C)*edge[j].R; flag=true; } } if(!flag) break; } for(j=1;j<=k;j++) { if(dis[edge[j].to]<(dis[edge[j].from]-edge[j].C)*edge[j].R) return true; } return false; } int main() { int i; while(scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF) { k=1; for(i=0;i<m;i++) { int a,b; double Rab,Rba,Cab,Cba; scanf("%d%d%lf%lf%lf%lf",&a,&b,&Rab,&Cab,&Rba,&Cba); edge[k].from=a,edge[k].to=b,edge[k].R=Rab,edge[k++].C=Cab; edge[k].from=b,edge[k].to=a,edge[k].R=Rba,edge[k++].C=Cba; } if(Bellman_Ford()) printf("YES\n"); else printf("NO\n"); } return 0; }