hdu 2680 Choose the best route (dijkstra)
2015-08-10 19:15
447 查看
/* 求点与点之间最短距离。因为此题的起始点不定, 所以可用反向图来求得,终点确定,从终点出发 */ # include <stdio.h> # include <algorithm> # include <string.h> using namespace std; # define INF 10000010 int map[2010][2010]; int dis[2010]; int vis[2010]; int n; void dijkstra(int s) { int i,j; int k=0; memset(vis,0,sizeof(vis)); for(i=1; i<=n; i++) dis[i]=map[s][i]; vis[s]=1; dis[s]=0; for(i=1; i<n; i++) //剩下的点 { int minn=INF; for(j=1; j<=n; j++) { if(!vis[j]&&dis[j]<minn) { minn=dis[j]; k=j; } } if(minn==INF) break; vis[k]=1;//最小的顶点 for(j=1; j<=n; j++) { if(!vis[j]&&dis[j]>dis[k]+map[k][j]) { dis[j]=dis[k]+map[k][j]; } } } return ; } int main() { int m,s,a,b,c,w,i,j; while(~scanf("%d%d%d",&n,&m,&s)) { // memset(map,INF,sizeof(map)); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) map[i][j]=INF; } for(i=0; i<m; i++) { scanf("%d%d%d",&a,&b,&c);///倒过来以s为起点出发 if(map[b][a]>c) map[b][a]=c; } memset(dis,0,sizeof(dis)); dijkstra(s); scanf("%d",&w); int minn=INF; while(w--) { scanf("%d",&a); minn=min(minn,dis[a]); } if(minn==INF) printf("-1\n"); else printf("%d\n",minn); } return 0; }