赞
踩
环内路径上的权值和为负。
两种基本的方法
实际上两种方法是等价的,都是判断是否路径包含n条边,
n
n
n条边的话就有
n
+
1
n+1
n+1个点
用的更多的还是第二种方法。
c n t [ x ] : 表示 x 的入队次数 cnt[x]:表示x的入队次数 cnt[x]:表示x的入队次数
#include <bits/stdc++.h> #define int long long #define rep(i,a,b) for(int i = (a); i <= (b); ++i) #define fep(i,a,b) for(int i = (a); i >= (b); --i) #define pii pair<int, int> #define ll long long #define db double #define endl '\n' #define x first #define y second #define pb push_back #define inf 0x3f3f3f3f*1ll using namespace std; void solve() { int n,m1,m2; cin>>n>>m1>>m2; vector<vector<pii>>g(n+1); rep(i,1,m1){ int u,v,w; cin>>u>>v>>w; g[u].pb({v,w}); g[v].pb({u,w}); } rep(i,1,m2){ int u,v,w; cin>>u>>v>>w; g[u].pb({v,-w}); } vector<int>inq(n+1,0); vector<int>cnt(n+1,0); vector<int>d(n+1,0); queue<int>q; rep(i,1,n){ q.push(i); inq[i]=1; } while(q.size()){ auto t=q.front(); q.pop(); int u=t; inq[u]=0; for(auto it:g[u]){ int v=it.x,w=it.y; if(d[v]>d[u]+w){ d[v]=d[u]+w; if(!inq[v]){ q.push(v); inq[v]=1; cnt[v]++; if(cnt[v]>=n){ cout<<"YES"<<endl; return; } } } } } cout<<"NO"<<endl; } signed main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); // freopen("1.in", "r", stdin); int _; cin>>_; while(_--) solve(); return 0; }
c n t [ x ] : 表示从起点到 x 所经过的最短路径的边数 cnt[x]:表示从起点到x所经过的最短路径的边数 cnt[x]:表示从起点到x所经过的最短路径的边数
#include <bits/stdc++.h> #define int long long #define rep(i,a,b) for(int i = (a); i <= (b); ++i) #define fep(i,a,b) for(int i = (a); i >= (b); --i) #define pii pair<int, int> #define ll long long #define db double #define endl '\n' #define x first #define y second #define pb push_back #define inf 0x3f3f3f3f*1ll using namespace std; void solve() { int n,m1,m2; cin>>n>>m1>>m2; vector<vector<pii>>g(n+1); rep(i,1,m1){ int u,v,w; cin>>u>>v>>w; g[u].pb({v,w}); g[v].pb({u,w}); } rep(i,1,m2){ int u,v,w; cin>>u>>v>>w; g[u].pb({v,-w}); } vector<int>inq(n+1,0); vector<int>cnt(n+1,0); vector<int>d(n+1,0); queue<int>q; rep(i,1,n){ q.push(i); inq[i]=1; } while(q.size()){ auto t=q.front(); q.pop(); int u=t; inq[u]=0; for(auto it:g[u]){ int v=it.x,w=it.y; if(d[v]>d[u]+w){ d[v]=d[u]+w; cnt[v]=cnt[u]+1; if(cnt[v]>=n){ cout<<"YES"<<endl; return; } if(!inq[v]){ q.push(v); inq[v]=1; } } } } cout<<"NO"<<endl; } signed main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); // freopen("1.in", "r", stdin); int _; cin>>_; while(_--) solve(); return 0; }
方法一跑出来的结果是
1024
m
s
1024ms
1024ms
方法二跑出来的结果是
671
m
s
671ms
671ms
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。