标签:std ++ sync -- stream spfa算法 namespace ems struct
题意:有向图判负环。
解题关键:spfa算法+hash判负圈。
负圈是指圈上的总和小于0
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> #include<queue> using namespace std; const int inf=0x3f3f3f3f; const int maxm=11111; const int maxn=500; int head[maxn],tot,n,m,num[maxn],w; struct edge{ int to; int w; int nxt; }e[maxm]; void add_edge(int u,int v,int w){ e[tot].w=w; e[tot].to=v; e[tot].nxt=head[u]; head[u]=tot++; } bool vis[maxn]; queue<int>que;//队列是点的队列 int d[maxn]; bool spfa(int s){ memset(num,0,sizeof num); fill(d+1,d+n+1,inf); memset(vis,0,sizeof vis); while(!que.empty()) que.pop(); que.push(s); vis[s]=true; d[s]=0; while (!que.empty()){ int u=que.front(); que.pop(); vis[u]=false; for (int i=head[u];i!=-1;i=e[i].nxt){ int v=e[i].to; int w=e[i].w; if (d[v]>d[u]+w){ d[v]=d[u]+w; if (!vis[v]){ vis[v]=true; que.push(v);//hash一下,可判断是否存在负环 num[v]++; if(num[v]>n) return true; } } } } return false; } int main(){ ios::sync_with_stdio(0); int a,b,c,T; cin>>T; while(T--){ tot=0; memset(head,-1,sizeof head); cin>>n>>m>>w; for(int i=0;i<m;i++){//注意为双向边 cin>>a>>b>>c; add_edge(a,b,c); add_edge(b,a,c); } for(int i=0;i<w;i++){ cin>>a>>b>>c; add_edge(a,b,-c); } if(spfa()) puts("YES"); else puts("NO"); } return 0; }
标签:std ++ sync -- stream spfa算法 namespace ems struct
原文地址:http://www.cnblogs.com/elpsycongroo/p/7896936.html