1 条题解
-
0
思路
按编号位置非降,双类距离转成上界差分边;先全图检测不可行,再求1到N的最紧上界,区分不可行-1与可任意远-2,可同位置不能加严格正间距。
参考程序(C++11)
#include <bits/stdc++.h> using namespace std; int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int n,ml,md;cin>>n>>ml>>md;vector<tuple<int,int,int>>e;for(int i=1;i<n;i++)e.push_back({i,i-1,0});for(int i=0;i<ml+md;i++){int a,b,w;cin>>a>>b>>w;--a;--b;if(a>b)swap(a,b);if(i<ml)e.push_back({a,b,w});else e.push_back({b,a,-w});}vector<long long>d(n);for(int k=0;k<n;k++){bool changed=false;for(auto edge:e){int u,v,w;tie(u,v,w)=edge;if(d[v]>d[u]+w){d[v]=d[u]+w;changed=true;}}if(!changed)break;if(k==n-1){cout<<-1<<'\n';return 0;}}const long long INF=1LL<<60;fill(d.begin(),d.end(),INF);d[0]=0;for(int k=1;k<n;k++){bool changed=false;for(auto edge:e){int u,v,w;tie(u,v,w)=edge;if(d[u]!=INF&&d[v]>d[u]+w){d[v]=d[u]+w;changed=true;}}if(!changed)break;}cout<<(d[n-1]==INF?-2:d[n-1])<<'\n';}
- 1