HDOJ-2680Choose the best route(Dijkstra)
2015-05-22 16:26
387 查看
多起点单终点的Dijkstra,不过和一个起点的没有区别,也不用以每个起点为源点做Dijkstra,加一个虚拟的节点1,连接所有起点,路径长度为0,从这个虚拟的1节点做就好了。
如果有多个终点的话也同理,加入一个虚拟的“总”终点。另外注意此题为单向边。
如果有多个终点的话也同理,加入一个虚拟的“总”终点。另外注意此题为单向边。
#include<cstdio> #include<cstring> using namespace std; const int inf=0x3F3F3F3; const int N=1005; int f ,dist ,vis ; int n,m,s; int min(int x,int y) { return x<y?x:y; } void Dijkstra(int u) { int i,j,pos,minm; for(i=1;i<=n;i++) { dist[i]=f[u][i]; vis[i]=0; } dist[u]=0; vis[u]=1; for(i=1;i<=n;i++) { pos=u; minm=inf; for(j=1;j<=n;j++) if(!vis[j]&&dist[j]<minm) { pos=j; minm=dist[j]; } vis[pos]=1; for(j=1;j<=n;j++) { if(!vis[j]) dist[j]=min(dist[j],dist[pos]+f[pos][j]); } } } void work() { int i,j,k,a,b,l,w,ans; memset(f,0X3F,sizeof(f)); for(i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&l); a++; b++; f[a][b]=min(f[a][b],l); } scanf("%d",&w); for(i=1;i<=w;i++) { scanf("%d",&a); a++; f[1][a]=0; } n++; Dijkstra(1); ans=inf; ans=min(ans,dist[s+1]); if(ans!=inf) printf("%d\n",ans); else printf("-1\n"); } int main() { while(scanf("%d%d%d",&n,&m,&s)!=EOF) work(); return 0; }
相关文章推荐
- hdoj 2680 Choose the best route(dijkstra 多起点 单终点)
- HDOJ 2680 Choose the best route(最短路,dijkstra)
- hdoj 2680 Choose the best route【最短路 dijkstra && SPFA】
- HDOJ 2680 Choose the best route(最短路--dijkstra)
- hdu 2680 Choose the best route(SPFA或者Dijkstra)
- HDU 2680-Choose the best route(Dijkstra)
- HDOJ--2680--Choose the best route
- hdoj 2680 Choose the best route
- HDUOJ_2680(Choose the best route )(dijkstra)
- HDOJ 题目2680 Choose the best route(最短路)
- HDOJ--2680--Choose the best route
- hdu 2680 Choose the best route (最短路问题 dijkstra | spfa)
- hdoj.2680 Choose the best route【最短路径】 2015/03/26
- HDU 2680 Choose the best route(Dijkstra,建图的方式很巧妙)
- hdu 2680 Choose the best route (Dijkstra & 反向图)
- HDU 2680 Choose the best route(Dijkstra)
- poj-2680-Choose the best route-dijkstra(基础最短路)
- HDU 2680 Choose the best route(dijkstra)
- hdoj 2680 Choose the best route
- hdu 2680 Choose the best route(最短路dijkstra(有重边))