NC20905. 饥饿
描述
输入描述
第一行四个数n,m,s,t。(分别表示有地图上n个地点,m条道路,SSJ在s处,他家在t处)第2-m+1三个正整数,f,u(某条路起点),v(到达点),w(路径距离)。(f为1或0,0表示这条道路上有恶狗拦路,SSJ已无力与恶狗打斗了,所以他要避开这些道路,1表示此条道路无危险)。
输出描述
第一行一个数表示最短路径长度,若无法回家输出“My gold!!!”(无引号)若可以回家.
示例1
输入:
5 7 1 5 0 1 4 4 1 1 3 2 1 1 5 7 1 2 5 10 0 2 3 1 1 3 5 2 1 4 3 7
输出:
4
C++11(clang++ 3.9) 解法, 执行用时: 139ms, 内存消耗: 2404K, 提交时间: 2020-04-10 12:29:11
#include<bits/stdc++.h> using namespace std; const int M = 2e5+10; const int INF=999999; int n,m,s,t,tot; int dis[M]; int u[M],v[M],w[M]; int dijkstra(int s,int t){ for(int i=0;i<=n;i++) dis[i]=INF; dis[s]=0; bool f; for(int i=0;i<n;i++){ f=1; for(int j=0;j<tot;j++){ if(dis[v[j]]!=INF&&dis[u[j]]>dis[v[j]]+w[j]) dis[u[j]] = dis[v[j]]+w[j],f=0; } if(f) break; } if(dis[t]!=INF) return dis[t]; return 0; } int main(){ cin>>n>>m>>s>>t; tot=0; int p,x,y,z; for(int i=0;i<m;i++){ cin>>p>>x>>y>>z; if(p){ u[tot]=x,v[tot]=y,w[tot]=z; tot++; u[tot]=y,v[tot]=x,w[tot]=z; tot++; } } if(!dijkstra(s,t)) cout<<"My gold!!!"<<endl; else cout<<dijkstra(s,t)<<endl; return 0; }
C++14(g++5.4) 解法, 执行用时: 188ms, 内存消耗: 7832K, 提交时间: 2020-04-11 15:47:04
#include<bits/stdc++.h> using namespace std; const int maxn=999999; int dis[maxn]; int u[maxn],v[maxn],w[maxn]; int main() { int n,m,s,t; int a,b,c,d; int l=1; cin>>n>>m>>s>>t; for (int i=1;i<=m;i++){ cin>>d>>a>>b>>c; if(d) { u[l]=a,v[l]=b,w[l]=c; l++; u[l]=b,v[l]=a,w[l]=c; l++; } } memset(dis,maxn,sizeof(dis)); dis[s]=0; while (m--) { int f=1; for (int i=1;i<l;i++){ if(dis[v[i]]>dis[u[i]]+w[i]) dis[v[i]]=dis[u[i]]+w[i],f=0; } if(f) break; } if (dis[t]==maxn)cout <<"My gold!!!"; else cout<<dis[t]; return 0; }