第一次用stl中的邻接表写,,以前总怕超时,,,,木想到还行,,,这一题就是判断是不是存在负环,,,
题意:一个农民在自家农场的不同地点发现一堆虫洞,每个虫洞可以回到不同长度的过去,于是这个农民想通个时间旅行回到出发点的”过去”。
#include<iostream>
#include<vector>
#include<stack>
#define N 505
#include<cstdio>
using namespace std;
struct Node{ int to,len;
};
vector<Node> list[N];
bool visit[N];
int dist[N];
int sum[N];
int n,m,w;
void init()
{ for(int i=1;i<=n;++i)
{list[i].clear();
dist[i]=0xfffffff;
visit[i]=false;
sum[i]=0;
}
}
bool spfa()
{ dist[1]=0,visit[1]=true,sum[1]=1;
stack<int> Q;
Q.push(1);
while(!Q.empty())
{ int u=Q.top();
Q.pop();
visit[u]=false;
int len=list[u].size();
for(int i=0;i<len;++i)
{ if(dist[list[u][i].to]>dist[u]+list[u][i].len)
{ dist[list[u][i].to]=dist[u]+list[u][i].len;
if(!visit[list[u][i].to])
{ sum[list[u][i].to]++;
Q.push(list[u][i].to);
visit[list[u][i].to]=true;
if(sum[list[u][i].to]>n) return true;
}
}
}
}
return false;
}
int main()
{ int test;
Node a;
scanf("%d",&test);
while(test--)
{ scanf("%d%d%d",&n,&m,&w);
init();
int b,c,d;
while(m--)
{ scanf("%d%d%d",&b,&c,&d);
a.to=c;
a.len=d;
list[b].push_back(a);
a.to=b;
list[c].push_back(a);
}
while(w--)
{ scanf("%d%d%d",&b,&c,&d);
a.to=c;
a.len=-d;
list[b].push_back(a);
}
if(spfa()) printf("YES\n");
else printf("NO\n");
}return 0;
}