-
W - 一个人的旅行
- HDU - 2066
- 强行加上初始点结束点即可
-
#include<bits/stdc++.h> using namespace std; #define maxn 55555 #define inf 0x3f3f3f3f vector<pair<int,int> >mp[maxn]; int t,s,d,dis[maxn],vis[maxn],u,v,w,cnt,ed; map<int,int>g; void spfa() { for(int i=0; i<=ed; i++) { dis[i]=inf; vis[i]=0; } vis[0]=1; dis[0]=0; queue<int>q; q.push(0); while(!q.empty()) { int top=q.front(); vis[top]=0; q.pop(); for(int i=0; i<mp[top].size(); i++) { if(dis[mp[top][i].first]>dis[top]+mp[top][i].second) { dis[mp[top][i].first]=dis[top]+mp[top][i].second; if(!vis[mp[top][i].first]) { q.push(mp[top][i].first); vis[mp[top][i].first]=1; } } } } } int main() { while(cin>>t>>s>>d) { g.clear(); for(int i=0; i<=cnt; i++) mp[i].clear(); cnt=0; while(t--) { cin>>u>>v>>w; if(g[u]==0) g[u]=++cnt; if(g[v]==0) g[v]=++cnt; mp[g[u]].push_back(make_pair(g[v],w)); mp[g[v]].push_back(make_pair(g[u],w)); } while(s--) { cin>>v; mp[0].push_back(make_pair(g[v],0)); } ed=cnt+d+1; while(d--) { cin>>v; if(g[v]==0) g[v]=++cnt; mp[g[v]].push_back(make_pair(ed,0)); } spfa(); cout<<dis[ed]<<endl; } return 0; }
一个人的旅行-SPFA-map-构点
猜你喜欢
转载自blog.csdn.net/BePosit/article/details/82048768
今日推荐
周排行