题目链接:            http://acm.hdu.edu.cn/showproblem.php?pid=2066

基于上个对图论的理解(hdu2544),这个就是多实例,多站点的最短路径问题,依然可以用dijkstra算法,具体的dijkstra在上几个分别针对不同方向有较详细的讲解;

这题的解法与上个类似,这里就不过多的分析,下面针对代码的部分处理做出各点的详细解释;代码+注释如下:

View Code
# include<stdio.h>
# include<string.h>
int map[1200][1200];//能开到1200*1200让我很意外
int flag[1200]; //存变量,控制过程
int count[1200]; //这个就是存的时间
int can[1200]; //这个can就是相邻的城市,用全局变量,下面不用传递
int want[1200]; //这个就是想要去的地方,用全局变量,下面不用传递
int s,d,max; ///用全局变量,下面不用传递,max,这里的作用下面讲解
int dijkstra() ///依然是dijkstra算法
{
int i,j,k,min,min1,pi,min2;
min=1000000000;
for(k=1;k<=s;k++) ///这里重复的便是始点,即:相邻的城市
{
memset(count,0,sizeof(count));///
memset(flag,0,sizeof(flag)); ///
min2=1000000000;
for(i=1;i<=max;i++)
{
flag[i]=0;
count[i]=map[can[k]][i];
}
flag[can[k]]=1;
count[can[k]]=0;
for(i=1;i<=max;i++)
{
min1=1000000000;
for(j=1;j<=max;j++)
{
if(flag[j]==0&&count[j]<min1)
{
min1=count[j];
pi=j;
}
}
if(min1==1000000000)
break;
flag[pi]=1;
for(j=1;j<=max;j++)
{
if(flag[j]==0&&count[j]>count[pi]+map[pi][j])
count[j]=count[pi]+map[pi][j];
}
}
for(i=1;i<=d;i++) ////这里就是从上个始点,所到达的想去的城市的最小值
{
if(count[want[i]]<min2)
min2=count[want[i]];
}
if(min2<min)//这里就是将各个最小值拿出来比较选出最最小值;
min=min2;
}
return min;
}
int main()
{
int t,i,j,a,b,c,dis;
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
for(i=0;i<1200;i++)
for(j=0;j<1200;j++)
map[i][j]=1000000000;
max=0;//////////初始化为0
for(i=1;i<=t;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c)
map[a][b]=c;
if(map[b][a]>c)
map[b][a]=c;
if(a>max)///这里max的作用,即使处理这里出现的最大的站的代号,也是一种优化,
max=a; //////////////////用上用不上就看数据了,如果a||b比较大就没什用
if(b>max)
max=b;
}
for(i=1;i<=s;i++) ///
scanf("%d",&can[i]);
for(i=1;i<=d;i++) ///
scanf("%d",&want[i]);
dis=dijkstra();
printf("%d\n",dis);
}
return 0;
}

  

posted on 2011-08-10 10:37  world_ding  阅读(288)  评论(0编辑  收藏  举报