HDU 2066 一个人的旅行
2014-06-28 18:03
295 查看
又是模版题,不容易啊。图论500题难得遇到这样的。
怒套SPFA。
多个起点,多个终点。
以每个起点做一次SPFA 然后比较 再比较就好。
怒套SPFA。
多个起点,多个终点。
以每个起点做一次SPFA 然后比较 再比较就好。
#include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<queue> #include<map> #include<iostream> #define INF 0xfffffff using namespace std; int n,m; int S,D; bool vis[1001]; int dis[1001]; int s[1001]; int d[1001]; struct lx { int v,c; }; vector<lx>g[1001]; int SPFA(int start) { for(int i=0;i<=n;i++) dis[i]=INF,vis[i]=0; queue<int>q; vis[start]=1,dis[start]=0; q.push(start); while(!q.empty()) { int u=q.front();q.pop(); vis[u]=0; for(int j=0;j<g[u].size();j++) { int v=g[u][j].v; int c=g[u][j].c; if(dis[v]>dis[u]+c) { dis[v]=dis[u]+c; if(!vis[v]) { vis[v]=1; q.push(v); } } } } int ans=INF; for(int i=0;i<D;i++) ans=min(ans,dis[d[i]]); return ans; } int main() { while(scanf("%d%d%d",&m,&S,&D)!=EOF) { n=0; for(int i=0;i<=1001;i++) g[i].clear(); while(m--) { int u,v,c; scanf("%d%d%d",&u,&v,&c); n=max(n,max(u,v)); lx now; now.c=c; now.v=u,g[v].push_back(now); now.v=v,g[u].push_back(now); } for(int i=0;i<S;i++) scanf("%d",&s[i]); for(int i=0;i<D;i++) scanf("%d",&d[i]); int ans=INF; for(int i=0;i<S;i++) { ans=min(ans,SPFA(s[i])); } if(ans!=INF) printf("%d\n",ans); else puts("-1"); } }
相关文章推荐
- HDU 2066 一个人的旅行
- HDU-2066 一个人的旅行
- HDU 2066-一个人的旅行(最短路Dijkstra)
- hdu 2066 一个人的旅行(单源最短路dijkstra)and hdu 2544
- HDU 2066 一个人的旅行
- HDU【2066】一个人的旅行
- 【hdu 2066】 一个人的旅行
- HDU 2066 一个人的旅行
- hdu 2066 一个人的旅行
- hdu 2066 一个人的旅行(dijkstra特殊)
- hdu2066 一个人的旅行 (floyd)
- hdu 2066 一个人的旅行【Dijkstra 12级新生训练—图论E】
- HDU——2066一个人的旅行(优先队列SPFA水题)
- HDU 2066 一个人的旅行【最短路 dijkstra & floyed & SPFA 】
- hdu 2066 一个人的旅行【vector优化】
- HDU 2066 一个人的旅行(最短路径)
- HDU 2066 一个人的旅行(Dijkstrea)
- HDU - 2066 一个人的旅行(Dijkstra)
- HDU 2066 一个人的旅行 Dijkstra
- HDU 2066 一个人的旅行(dijkstra)