农场间有若干条双向路,还有一些单向的虫洞,在虫洞中走会使时间倒流,问会不会从某点出发,在负时间返回
其实就是一个求负环的问题,注意这句话“Two fields might be connected by more than one path.”,小处理下即可
#include<iostream>
#include<queue>
using namespace std;
const int MAX=50000000;
int a[501][501];
int cnt;
int dis[501];
int num[501];
void init()
{
for(int i=0; i<=500; i++)
{
dis[i]=MAX;
num[i]=0;
}
for(int i=0; i<501; i++)
for(int j=0; j<501; j++)
a[i][j]=MAX;
}
bool bellman()
{
bool isin[501]= {0};
queue<int> q;
q.push(1);
dis[1]=0;
num[1]++;
isin[1]=1;
while(q.size())
{
int t=q.front();
for(int i=1; i<=cnt; i++)
{
if(dis[t]+a[t][i]<dis[i])
{
dis[i]=dis[t]+a[t][i];
if(isin[i]==0)
{
isin[i]=1;
q.push(i);
num[i]++;
if(num[i]>cnt)
return true;
}
}
}
isin[t]=0;
q.pop();
}
return false;
}
int main()
{
int f;
cin>>f;
while(f--)
{
init();
int m,w;
cin>>cnt>>m>>w;
int t1,t2,tmp;
while(m--)
{
cin>>t1>>t2>>tmp;
if(tmp<a[t1][t2])
a[t1][t2]=tmp;
if(tmp<a[t2][t1])
a[t2][t1]=tmp;
}
while(w--)
{
cin>>t1>>t2>>tmp;
if(-tmp<a[t1][t2])
a[t1][t2]=-tmp;
}
if(bellman())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}