POJ 3259 Wormholes SPFA判负环
思路:SPFA判负环
数组不要开太小……
(后面附一组测试数组)
// by SiriusRen
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 13555
int n,cases,m,W,xx,yy,zz,tot,first[N],v[N],w[N],next[N],d[N],in[N];
bool vis[N];
void add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}
bool spfa(int x){
memset(d,0x3f,sizeof(d));
queue<int>q;
d[x]=0,q.push(x),vis[x]=1;
while(!q.empty()){
int temp=q.front();q.pop();
vis[temp]=0;
for(int i=first[temp];~i;i=next[i])
if(d[v[i]]>d[temp]+w[i]){
d[v[i]]=d[temp]+w[i];
if(!vis[v[i]]){
q.push(v[i]);
vis[v[i]]=1;
in[v[i]]++;
if(in[v[i]]>n)return 1;
}
}
}
return 0;
}
int main()
{
scanf("%d",&cases);
while(cases--)
{
memset(first,-1,sizeof(first)),tot=0;
memset(vis,0,sizeof(vis));
memset(in,0,sizeof(in));
scanf("%d%d%d",&n,&m,&W);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&xx,&yy,&zz);
add(xx,yy,zz),add(yy,xx,zz);
}
for(int i=1;i<=W;i++)
{
scanf("%d%d%d",&xx,&yy,&zz);
add(xx,yy,-zz);
}
if(spfa(1))puts("YES");
else puts("NO");
}
}
5
5 10 2
1 3 277
3 5 7116
5 5 3567
2 4 6023
5 3 1453
3 1 1083
4 1 2414
1 3 8174
2 5 6055
3 2 9029
3 5 1466
2 5 88
5 10 2
2 4 8688
3 2 619
3 5 9103
5 5 6657
5 3 8188
3 3 7513
5 1 9068
1 3 5184
4 5 8318
4 3 3706
5 3 591
5 2 1605
5 10 2
4 3 7819
3 1 4797
4 3 6176
1 3 6207
2 1 9643
3 1 2436
2 5 2302
3 5 401
4 2 3435
2 2 4987
5 3 1173
3 4 1078
5 10 2
1 5 9720
5 2 7917
1 5 5038
2 4 6890
3 5 9688
1 5 1063
1 3 5468
5 2 5244
2 2 435
1 5 5763
5 4 293
1 2 929
5 10 2
4 3 66
4 4 8651
3 4 8304
4 5 7845
2 3 2923
1 3 5425
1 1 526
5 4 2853
1 3 4244
5 3 6174
2 5 1090
1 4 103
ans:
YES
NO
YES
NO
NO