题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066
这里有多个起点和终点,所以需要转换一下,将小草的位置定位0,小草到起点的距离为0,最后遍历一下到各个终点的最小距离就可以;
#include<iostream> #include<string> #include<cstdio> #include<cstring> #include<map> #include<queue> #include<cmath> #include<stack> #include<set> #include<vector> #include<algorithm> #define LL long long #define inf 1<<29 #define s(a) scanf("%d",&a) #define CL(a,b) memset(a,b,sizeof(a)) using namespace std; const int N=1025; int n,m,a,b,c; int Map[N][N]; bool vis[N]; int dist[N]; int e[N]; int T,S,D; void dijkstra() { CL(vis,false); for(int i=0;i<=n;i++) dist[i]=inf; dist[0]=0; //vis[0]=true; while(1){ int v=-1; for(int u=0;u<=n;u++) // 选取最短路径; if(!vis[u]&&(v==-1||dist[u]<dist[v])) v=u; if(v==-1) break; // 没有最短路了,返回; vis[v]=true; for(int u=0;u<=n;u++) // 更新最短路径; dist[u]=min(dist[u],dist[v]+Map[v][u]); } } int main() { while(~scanf("%d%d%d",&T,&S,&D)){ for(int i=0;i<=1025;i++){ for(int j=0;j<=1025;j++) Map[i][j]=inf; Map[i][i]=0; } n=0; for(int i=1;i<=T;i++){ scanf("%d%d%d",&a,&b,&c); n=max(max(a,b),n); // 这里把n写成了c。。。WA到orz.... if(Map[a][b]>c) Map[a][b]=Map[b][a]=c; } for(int i=1;i<=S;i++){ s(a); Map[0][a]=Map[a][0]=0; } for(int i=0;i<D;i++) s(e[i]); dijkstra(); int minn=inf; for(int i=0;i<D;i++) minn=min(minn,dist[e[i]]); printf("%d\n",minn); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/wlxsq/article/details/48090995