6 2 3 1 3 5 1 4 7 2 8 12 3 8 4 4 9 12 9 10 2 1 2 8 9 10
9
题意:s个起点,d个终点,在所有起点到终点的路径中找一条最短路径。一遍迪杰斯特拉能找到一个起点到各个终点的最近的距离,所以进行s遍迪杰斯特拉算法就能找到最短的那条路径。这里的终点最好用哈希的方式存储,这样便于找最短距离。
#include <cstdio> #include <cstdlib> #include <algorithm> #include <climits> using namespace std; const int MAX = 1002; int map[MAX][MAX],visit[MAX],dist[MAX],ss[MAX],dd[MAX]; int s,d,res,lm; void init(){ int i,j; for(i=1;i<MAX;++i){ dist[i] = INT_MAX; visit[i] = 0; for(j=1;j<MAX;++j){ map[i][j] = INT_MAX; } } } void reset(){ int i; for(i=1;i<=lm;++i){ dist[i] = INT_MAX; visit[i] = 0; } } void DJ(int st){ int i,j,minx,k; for(i=1;i<=lm;++i){ dist[i] = map[st][i]; } visit[st] = 1; for(i=1;i<lm;++i){ minx = INT_MAX; k = st; for(j=1;j<=lm;++j){ if(visit[j]==0 && dist[j]<minx){ minx = dist[j]; k = j; } } visit[k] = 1; if(dd[k]==1 && dist[k]<res){//用哈希的方式存储便于这里记录符合条件的最短距离 res = dist[k]; } for(j=1;j<=lm;++j){ if(visit[j]==1 || map[k][j]==INT_MAX)continue; if(dist[k] + map[k][j]<dist[j]){ dist[j] = dist[k] + map[k][j]; } } } } int main(){ //freopen("in.txt","r",stdin); int t,i,x,y,c,pos; while(scanf("%d %d %d",&t,&s,&d)!=EOF){ init(); memset(dd,0,sizeof(dd)); lm = -1; for(i=0;i<t;++i){ scanf("%d %d %d",&x,&y,&c); if(map[x][y]>c){ map[x][y] = map[y][x] = c; } if(x>lm)lm=x; if(y>lm)lm=y; } for(i=0;i<s;++i){ scanf("%d",&ss[i]); } for(i=0;i<d;++i){ scanf("%d",&pos); dd[pos] = 1;//这里的终点最好用哈希的方式存储 } res = INT_MAX; for(i=0;i<s;++i){ reset(); DJ(ss[i]); } printf("%d\n",res); } return 0; }
HDU 2066 一个人的旅行,布布扣,bubuko.com
原文:http://blog.csdn.net/iaccepted/article/details/23450723