hdu 2680 Choose the best route(spfa/dijkstra)
2016-08-29 21:53
274 查看
题意:
给你一张 有向图 然后让你求多个起点到一个终点的最短路径坑点:从x到y可能有多条路。
思路:
有一个巧妙地办法:把终点当成起点,构图时反向建图。
AC代码(spfa,280ms):
#include <iostream> #include <string.h> #include <vector> #include <cstdio> #include <queue> using namespace std; struct edge{ int y; int v; }; int dis[1100]; vector <edge> v[1100]; int vis[1100];//是否在队列中 int cnt[1100]; bool spfa(int b,int n){ queue<int> q; q.push(b); vis[b] = true; dis[b] = 0; while(!q.empty()){ int po = q.front(); q.pop(); vis[po] = false; cnt[po]++; if(cnt[po] >= n) return false; for(int i = 0;i < v[po].size();i++){ if(dis[v[po][i].y] > dis[po] + v[po][i].v){ dis[v[po][i].y] = dis[po] + v[po][i].v; if(vis[v[po][i].y] == false){ q.push(v[po][i].y); vis[v[po][i].y] = true; cnt[v[po][i].y]++; if(cnt[v[po][i].y] >= n) return false; } } } } return true; } int main() { int n,m,b; while(~scanf("%d%d%d",&n,&m,&b)){ memset(dis,0x3f3f3f3f,sizeof(dis)); memset(vis,false,sizeof(vis)); memset(cnt,0,sizeof(cnt)); int x; edge temp; for(int i = 1;i <= m;i++){ scanf("%d%d%d",&temp.y,&x,&temp.v); v[x].push_back(temp); } spfa(b,n); int ne,e; scanf("%d",&ne); int ans = 0x3f3f3f3f; for(int i = 1;i <= ne;i++){ scanf("%d",&e); ans = min(ans,dis[e]); } if(ans == 0x3f3f3f3f) printf("-1\n"); else printf("%d\n",ans); for(int i = 1;i <= n;i++){ v[i].clear(); } } return 0; }
AC代码(dijkstra 327ms):
#include <iostream> #include <string.h> #include <vector> #include <cstdio> #include <queue> using namespace std; struct edge{ int y; int v; bool operator < (const edge &b)const{ return v > b.v; } }; int dis[1100]; vector <edge> v[1100]; int vis[1100];//是否在松驰过 bool t[1100][1100];//是否有多条路 void dijkstra(int b){ priority_queue<edge> q; dis[b] = 0; edge temp; temp.y = b; temp.v = 0; q.push(temp); int po = q.top().y; while(!q.empty()){ po = q.top().y; q.pop(); for(int i = 0;vis[po] == false && i < v[po].size();i++){ if(dis[v[po][i].y] > dis[po] + v[po][i].v){ dis[v[po][i].y] = dis[po] + v[po][i].v; temp.y = v[po][i].y; temp.v = dis[v[po][i].y]; q.push(temp); } } vis[po] = true; } } int main() { int n,m,b; while(~scanf("%d%d%d",&n,&m,&b)){ memset(dis,0x3f3f3f3f,sizeof(dis)); memset(vis,false,sizeof(vis)); memset(t,false,sizeof(t)); int x; edge temp; for(int i = 1;i <= m;i++){ scanf("%d%d%d",&temp.y,&x,&temp.v); v[x].push_back(temp); if(t[x][temp.y] == false){ v[x].push_back(temp); t[x][temp.y] = true; } else{ for(int i = 0;i < v[x].size();i++){ if(v[x][i].y == temp.y){ v[x][i].v = min(v[x][i].v,temp.v); break; } } } } dijkstra(b); int ne,e; scanf("%d",&ne); int ans = 0x3f3f3f3f; for(int i = 1;i <= ne;i++){ scanf("%d",&e); ans = min(ans,dis[e]); } if(ans == 0x3f3f3f3f) printf("-1\n"); else printf("%d\n",ans); for(int i = 1;i <= n;i++){ v[i].clear(); db77 } } return 0; }
相关文章推荐
- HDU 2680 Choose the best route 【最短路 反向建图 dijkstra & SPFA 】
- HDU 2680 Choose the best route【多源最短路,Dijkstra+spfa】
- hdu 2680 Choose the best route (最短路问题 dijkstra | spfa)
- hdu 2680 Choose the best route(SPFA或者Dijkstra)
- HDU-2680-Choose the best route【spfa】
- HDU 2680 Choose the best route 超级起点 多源起点dijkstra
- hdu 2680-Choose the best route最短路dijkstra
- hdu-2680-Choose the best route(dijkstra)
- HDU 2680 Choose the best route(dijkstra)
- hdu 2680 Choose the best route (dijkstra)
- hdoj 2680 Choose the best route【最短路 dijkstra && SPFA】
- HDU 2680 Choose the best route(简单Dijkstra)
- HDU 2680 Choose the best route 变形最短路 DIJKSTRA
- hdu2680 Choose the best route (dijkstra)
- hdu 2680 Choose the best route (Dijkstra & 反向图)
- HDU 2680 Choose the best route(dijkstra)
- HDU-2680 Choose the best route(最短路[Dijkstra])
- hdu-2680Choose the best route (dijkstra求最短路)
- HDU 2680 Choose the best route(Dijkstra)
- HDU 2680-Choose the best route(Dijkstra)