这题是用bellman-ford求负权回路的问题。数组一定要开5100以上,不然会RE。这是我写的第二题Bellman-ford,写得很顺手了。加油加油~
#include <iostream> #include <fstream> using namespace std; #define MAX 5100 #define FAR 10001 int k,n; //k为边数 n为顶点数 int dist[MAX]; struct node{ int start,end; int weight; }edge[MAX]; bool Bellman_ford() { int s,e,t; int i,j; for(i=1; i<n; i++) { bool finish=true; for(j=0; j<k; j++) { s=edge[j].start; e=edge[j].end; t=edge[j].weight; if(dist[e]>dist[s]+t) { dist[e]=dist[s]+t; finish=false; } } if(finish) break; } for(i=0; i<k; i++) { s=edge[i].start; e=edge[i].end; t=edge[i].weight; if(dist[e]>dist[s]+t) { dist[e]=dist[s]+t; return true; } } return false; } int main() { int farms,s,e,t; int i,m,w; freopen("acm.txt","r",stdin); scanf("%d",&farms); while(farms--) { k=0; for(i=0; i<MAX; i++) { dist[i]=FAR; //默认最大 } scanf("%d%d%d",&n,&m,&w); for(i=0; i<m; i++) { scanf("%d%d%d",&s,&e,&t); edge[k].start=s; edge[k].end=e; edge[k++].weight=t; edge[k].start=e; edge[k].end=s; edge[k++].weight=t; } //可退回t seconds for(i=0; i<w ;i++) { scanf("%d%d%d",&s,&e,&t); edge[k].start=s; edge[k].end=e; edge[k++].weight=-t; } if(Bellman_ford()) printf("YES\n"); else printf("NO\n"); } return 0; }