您的位置:首页 > 编程语言 > Go语言

HDU-2066 一个人的旅行

2011-08-23 23:40 621 查看
Just to practice Dijkstra :-)

HINT:添加一个超级源,和一个超级汇。这个样例数据让人心里没底,因为题中没说城市的编号范围是多少。

/*
* HDU-2066 一个人的旅行
* mike-w
* 2011-8-23
* ---------------------
* practice shortest path algorithm
*/
#include<stdio.h>
#define SIZE 1111
#define INF (1<<30)

int time[SIZE][SIZE];
int dist[SIZE];
int in[SIZE];
int T,S,D;
int src,sink;

int extract(void)
{
int t,i;

for(i=0;i<=sink;i++)
if(!in[i])
break;
for(t=i++;i<=sink;i++)
if(!in[i]&&dist[t]>dist[i])
t=i;
return t;
}

int dijkstra(void)
{
int min,i;

dist[src]=0;
while((min=extract())!=sink)
{
in[min]=1;
for(i=0;i<=sink;i++)
if(!in[i]&&time[min][i]&&dist[min]+time[min][i]<dist[i])
dist[i]=dist[min]+time[min][i];
}
return dist[sink];
}

int main(void)
{
int i,j,t1,t2,t3;

#ifndef ONLINE_JUDGE
freopen("2066.in","r",stdin);
#endif

while(scanf("%d%d%d",&T,&S,&D)!=EOF)
{
/* initialize */
src=0;
sink=1010;
for(i=0;i<=sink;i++)
{
dist[i]=INF;
in[i]=0;
}
for(i=0;i<=sink;i++)
for(j=0;j<=sink;j++)
time[i][j]=0;
/* read input */
for(i=0;i<T;i++)
{
scanf("%d%d%d",&t1,&t2,&t3);
if(!time[t1][t2])
time[t1][t2]=time[t2][t1]=t3;
else if(time[t1][t2]>t3)
time[t1][t2]=time[t2][t1]=t3;
}
for(i=0;i<S;i++)
scanf("%d",&t1),time[src][t1]=time[t1][src]=1;
for(i=0;i<D;i++)
scanf("%d",&t1),time[sink][t1]=time[t1][sink]=1;
/* produce output */
printf("%d\n",dijkstra()-2);
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algorithm output input path