http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1002&ojid=0&cid=3905&hide=0
一个人的旅行
Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 12 Accepted Submission(s) : 6
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
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
用Dijkstra求最以from为起点到want的最短路径
#include<stdio.h>
#include<string.h>
#define inf 100000000
int max;
int map[1200][1200];
int d[1200];
int s[1200];
int from[1200];
int want[1200];
int T,S,D; // ss 个起点 dd个终点
int dij(int v)
{
int i,j,min,pos;
for(i=1; i<=1050; i++)
{
s[i]=0;
d[i]=map[v][i];
}
s[v]=1;
d[v]=0;
for(i=1; i<1050; i++)
{
min=inf;
for(j=1; j<=1050; j++)
{
if(!s[j]&&min>d[j])
{
pos=j;
min=d[j];
}
}
s[pos]=1;
if(min==inf) break; //当剩余点距离都为无限大,结束
for(j=1; j<=1050; j++)
{
if(!s[j]&&d[j]>(d[pos]+map[pos][j]))
d[j]=d[pos]+map[pos][j];
}
}
min=inf;
for(i=1; i<=D; i++)
{
if(min>d[want[i]])
min=d[want[i]];
}
return min;
}
int main()
{
int i,j,k;
int a,b,time;
while(scanf("%d%d%d",&T,&S,&D)!=EOF)
{
max=0;
for(i=1; i<=1100; i++)
for(j=1; j<=1100; j++)
map[i][j]=inf;
for(i=1; i<=T; i++)
{
scanf("%d%d%d",&a,&b,&time);
if(map[a][b]>time)
map[a][b]=map[b][a]=time;
if(max<time)
max=time;
}
for(i=1; i<=S; i++)
scanf("%d",&from[i]);
for(i=1; i<=D; i++)
scanf("%d",&want[i]);
k=inf;
for(i=1; i<=S; i++)
{
if(k>dij(from[i]))
k=dij(from[i]);
}
printf("%d\n",k);
}
return 0;
}
/*
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
*/