904. 蟲洞
阿新 • • 發佈:2020-12-13
\(spfa\)判負環裸題
const int N=510; vector<PII> g[N]; int dist[N]; bool vis[N]; int cnt[N]; int n,m,w; bool spfa() { memset(dist,0x3f,sizeof dist); memset(cnt,0,sizeof cnt); memset(vis,0,sizeof vis); queue<int> q; for(int i=1;i<=n;i++) { q.push(i); vis[i]=true; } while(q.size()) { int t=q.front(); q.pop(); vis[t]=false; for(int i=0;i<g[t].size();i++) { int j=g[t][i].fi,w=g[t][i].se; if(dist[j] > dist[t]+w) { dist[j]=dist[t]+w; cnt[j]=cnt[t]+1; if(cnt[j] >= n) return true; if(!vis[j]) { vis[j]=true; q.push(j); } } } } return false; } int main() { int T; cin>>T; while(T--) { cin>>n>>m>>w; for(int i=1;i<=n;i++) g[i].clear(); while(m--) { int a,b,c; cin>>a>>b>>c; g[a].pb({b,c}); g[b].pb({a,c}); } while(w--) { int a,b,c; cin>>a>>b>>c; g[a].pb({b,-c}); } bool t=spfa(); if(t) puts("YES"); else puts("NO"); } //system("pause"); }