NC50381. 道路和航线
描述
输入描述
第一行为四个空格隔开的整数:T,R,P,S;
第二到第R+1行:三个空格隔开的整数(表示一条道路):和;
第R+2到R+P+1行:三个空格隔开的整数(表示一条航线):和。
输出描述
输出T行,第i行表示到达城镇i的最小花费,如果不存在输出NO PATH。
示例1
输入:
6 3 3 4 1 2 5 3 4 5 5 6 10 3 5 -100 4 6 -100 1 3 -10
输出:
NO PATH NO PATH 5 0 -95 -100
说明:
一共六个城镇。在1和2,3和4,5和6之间有道路,花费分别是5,5,10。同时有三条航线:,和,花费分别是-100,-100,-10。FJ的中心城镇在城镇4。FJ的奶牛从4号城镇开始,可以通过道路到达3号城镇。然后他们会通过航线达到5和6号城镇。但是不可能到达1和2号城镇。C++(g++ 7.5.0) 解法, 执行用时: 373ms, 内存消耗: 3972K, 提交时间: 2022-08-13 20:20:50
// NC50381 - 道路和航线 #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #include <bits/stdc++.h> using namespace std; int main(int argc, char *argv[]) { const int INF = 1000000000; cin.tie(0)->sync_with_stdio(0); int T, R, P, S; cin >> T >> R >> P >> S; vector<vector<pair<int, int>>> g(T); int u, v, w; for (int i = 0; i < R; i++) { cin >> u >> v >> w; g[u - 1].push_back({v - 1, w}); g[v - 1].push_back({u - 1, w}); } for (int i = 0; i < P; i++) { cin >> u >> v >> w; g[u - 1].push_back({v - 1, w}); } vector<int> dist(T, INF); deque<int> q; dist[S - 1] = 0; for (q.push_back(S - 1); !q.empty(); ) { auto u = q[0]; q.pop_front(); for (auto t: g[u]) { int v = t.first, w = t.second; if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; if (q.empty() || dist[v] > dist[q.front()]) q.push_back(v); else q.push_front(v); } } } for (auto x: dist) if (x != INF) cout << x << "\n"; else cout << "NO PATH\n"; return 0; }
C++(clang++11) 解法, 执行用时: 582ms, 内存消耗: 2696K, 提交时间: 2021-02-04 21:19:56
#include<bits/stdc++.h> using namespace std; int t,r,p,s,a,b,c,i,e[250001],f[250001],h[25011],w[250001],l[25011],v[25011],k,x,M=0x3f3f3f3f; deque<int>q; void g(int a,int b,int c) { e[++k]=b,f[k]=h[a],h[a]=k,w[k]=c; }int main() { cin>>t>>r>>p>>s; q.push_back(s); for(;r--;) { cin>>a>>b>>c; g(a,b,c),g(b,a,c); }for(;p--;) { cin>>a>>b>>c; g(a,b,c); }for(i=1;i<=t;i++)l[i]=M; memset(v,0,sizeof v); l[s]=0;v[s]=1; while(q.size()) { x=q.front(); q.pop_front(); v[x]=0; for(i=h[x];i;i=f[i]) { if(l[x]+w[i]<l[e[i]]) { l[e[i]]=l[x]+w[i]; if(!v[e[i]]) { v[e[i]]=1; if(q.size()&&l[e[i]]<l[q.front()])q.push_front(e[i]); else q.push_back(e[i]); } } } }for(i=1;i<=t;i++) { if(l[i]==M)puts("NO PATH"); else cout<<l[i]<<'\n'; } }