spfa找负环。。。。
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; const int MaxV=800; const int MaxE=8000; typedef struct Edge { int to,next,cost; }Edge; Edge edge[MaxE]; int Adj[MaxV],Size; void Init() { memset(Adj,-1,sizeof(Adj)); Size=0; } void Add_Edge(int u,int v,int c) { edge[Size].to=v; edge[Size].next=Adj[u]; edge[Size].cost=c; Adj[u]=Size++; } int dist[MaxV],cQ[MaxV]; bool inQ[MaxV]; bool spfa() { memset(dist,63,sizeof(dist)); memset(cQ,0,sizeof(cQ)); memset(inQ,false,sizeof(inQ)); dist[1]=0; queue<int> q; inQ[1]=true;q.push(1); cQ[1]=1; while(!q.empty()) { int u=q.front();q.pop(); for(int i=Adj[u];~i;i=edge[i].next) { int v=edge[i].to; if(dist[v]>dist[u]+edge[i].cost) { dist[v]=dist[u]+edge[i].cost; if(!inQ[v]) { inQ[v]=true; cQ[v]++; if(cQ[v]>=MaxV) return true; q.push(v); } } } inQ[u]=false; } return false; } int main() { int T; scanf("%d",&T); while(T--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); Init(); for(int i=0;i<b;i++) { int u,v,c; scanf("%d%d%d",&u,&v,&c); Add_Edge(u,v,c); Add_Edge(v,u,c); } for(int i=0;i<c;i++) { int u,v,c; scanf("%d%d%d",&u,&v,&c); Add_Edge(u,v,-c); } if(spfa()) puts("YES"); else puts("NO"); } return 0; }
原文:http://blog.csdn.net/u012797220/article/details/18415727