| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
这题题意有点不清楚附代码:
#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 1005
int i,j,k,n,m,t,w,u,v,len;
int q[2000000],a[N][N],num[N],dis[N];
bool vis[N];
bool spfa(){
memset(dis,60,sizeof(dis));
dis[1]=0;
int l=1,r=1;
num[1]=q[1]=vis[1]=1;
while(l<=r){
for(int i=1;i<=n;i++)
if(dis[q[l]]+a[q[l]][i]<dis[i]){
dis[i]=dis[q[l]]+a[q[l]][i];
// if(dis[i]<0)return 1;
if(!vis[i]){
vis[i]=1,q[++r]=i,num[i]++;
if(num[i]>=n)return 1;
}
}vis[q[l]]=0;l++;
}return 0;
}
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d %d %d",&n,&m,&w);
memset(a,60,sizeof(a)),memset(num,0,sizeof(num)),memset(vis,0,sizeof(vis));
for(i=1;i<=m;i++){
scanf("%d %d %d",&u,&v,&len);
a[u][v]=min(a[u][v],len);
a[v][u]=min(a[v][u],len);
}
for(i=1;i<=w;i++){
scanf("%d %d %d",&u,&v,&len);
a[u][v]=min(a[u][v],-len);
}
if(spfa())printf("YES\n");
else printf("NO\n");
}
return 0;
}
以上那句注释掉的句子,是导致WA的关键
这题不是说只要回到过去就行了,所以我就想了这个剪枝
但是加了之后就WA了,也就是说一定要有负环,但是题目没说一定要回到原点啊?
有没有大牛解释一下?
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator