【SPFA】判负环 bzoj1715 Wormholes虫洞

dfs实现的SPFA判负环较快 访问到已访问的点即为负环

bfs要开数组记录访问过n次

#include<cstdio>
#include<cstring>
using namespace std;
int n;
 
int num,last[505],nxt[5505],ver[5505],len[5505];
inline void add(int x,int y,int z)
 {nxt[++num]=last[x]; last[x]=num; ver[num]=y; len[num]=z;
 }
  
int dis[505]; bool vis[505],flag=0; 
void spfa(int x)
 {vis[x]=1;
  for(int i=last[x];i;i=nxt[i])
   {int y=ver[i];
    if(dis[x]+len[i]<dis[y])
     {dis[y]=dis[x]+len[i];
      if(vis[y]) {flag=1;return;}
      spfa(y);
     }
   }
  vis[x]=0; 
 } 
int main()
 {  
 int t,x,y,z,m,w;  scanf("%d",&t);
     
 while(t--) 
  { memset(last,0,sizeof(last));
    memset(vis,0,sizeof(vis));
    memset(dis,0,sizeof(dis));
    num=0; flag=0;
        
    scanf("%d%d%d",&n,&m,&w);
     
    while(m--)
      {scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z);}
       
    while(w--)  
      {scanf("%d%d%d",&x,&y,&z); add(x,y,-z);}
       
    for(int i=1;i<=n;i++) {spfa(i);  if(flag) break;  }
     
    if(flag) printf("YES\n");
    else     printf("NO\n");
  }     
return 0;
 }

猜你喜欢

转载自blog.csdn.net/qq_42704115/article/details/82806644