解题关键:模板保存。
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> #include<queue> #define inf 0x3f3f3f3f using namespace std; const int inf=0x3f3f3f3f; const int maxm=111110; const int maxn=20020; int head[maxn],tot,n,m; struct edge{ int to; int w; int nxt; }e[maxm]; void add_edge(int u,int v,int w){ e[tot].w=w; e[tot].to=v; e[tot].nxt=head[u]; head[u]=tot++; } bool vis[maxn]; int d[maxn]; // bool dfs_spfa(int u){ vis[u]=1; for(int i=head[u];i!=-1;i=e[i].nxt){ int v=e[i].to; if(d[v]>d[u]+e[i].w){ d[v]=d[u]+e[i].w; if(vis[v]||dfs_spfa(v)) return 1; } } vis[u]=0; return 0; } int main(){ int a,b,c,T; scanf("%d",&T); while(T--){ tot=0; memset(head,-1,sizeof head); memset(vis,0,sizeof vis); memset(d,0,sizeof d); scanf("%d%d",&n,&m); for(int i=0;i<m;i++){//注意为双向边 scanf("%d%d%d",&a,&b,&c); if(c<0) add_edge(a,b,c); else add_edge(a,b,c),add_edge(b,a,c); } bool flag=false; for(int i=1;i<=n;i++){ if(dfs_spfa(i)){ flag=true; break; } } if(flag) puts("YE5"); else puts("N0"); } return 0; }
原文地址:https://www.cnblogs.com/elpsycongroo/p/10353439.html
时间: 2024-10-16 06:33:43