1 solutions
-
1
学过最短路的都能做。
#include<iostream> #include<cstdio> #include<vector> #include<queue> #include<cstring> #include<algorithm> using namespace std; const int NR=40001; vector<int> g[NR]; bool f[NR]; int n,dis1[NR],dis2[NR],dis3[NR]; void spfa1() { queue<int> q; q.push(1); memset(dis1,0x3f,sizeof(dis1)); dis1[1]=0; f[1]=true; while(!q.empty()) { int u=q.front(),i; q.pop(); f[u]=false; for(i=0;i<g[u].size();i++) if(dis1[u]+1<dis1[g[u][i]]) { dis1[g[u][i]]=dis1[u]+1; if(!f[g[u][i]]) { q.push(g[u][i]); f[g[u][i]]=true; } } } return; } void spfa2() { queue<int> q; q.push(2); memset(dis2,0x3f,sizeof(dis2)); dis2[2]=0; memset(f,false,sizeof(f)); f[2]=true; while(!q.empty()) { int u=q.front(),i; q.pop(); f[u]=false; for(i=0;i<g[u].size();i++) if(dis2[u]+1<dis2[g[u][i]]) { dis2[g[u][i]]=dis2[u]+1; if(!f[g[u][i]]) { q.push(g[u][i]); f[g[u][i]]=true; } } } return; } void spfa3() { queue<int> q; q.push(n); memset(dis3,0x3f,sizeof(dis3)); dis3[n]=0; memset(f,false,sizeof(f)); f[n]=true; while(!q.empty()) { int u=q.front(),i; q.pop(); f[u]=false; for(i=0;i<g[u].size();i++) if(dis3[u]+1<dis3[g[u][i]]) { dis3[g[u][i]]=dis3[u]+1; if(!f[g[u][i]]) { q.push(g[u][i]); f[g[u][i]]=true; } } } return; } int main() { int b,e,p,m,i; cin>>b>>e>>p>>n>>m; while(m--) { int u,v; cin>>u>>v; g[u].push_back(v); g[v].push_back(u); } spfa1(); spfa2(); spfa3(); long long ans=1ll*b*dis1[n]+1ll*e*dis2[n]; for(i=1;i<=n;i++) ans=min(ans,1ll*b*dis1[i]+1ll*e*dis2[i]+1ll*p*dis3[i]); cout<<ans; return 0; }
- 1
Information
- ID
- 2154
- Time
- 1000ms
- Memory
- 125MiB
- Difficulty
- 5
- Tags
- # Submissions
- 1
- Accepted
- 1
- Uploaded By