您的位置:首页 > 其它

水题堆2.G - 一个人的旅行 (dijkstra算法

2018-02-14 22:36 281 查看
#include <stdio.h>
#include <stdlib.h>
#define MAX 1001
#define INF 1000000
int s[1001],d[1001],cost[1001][1001],u[1001],answer[1001],use[1001],t,T,S,D,n;
int min(int a,int b)
{
return a<b?a:b;
}
int max(int a,int b)
{
return a>b?a:b;
}
void f(int n,int cost[1001][1001])
{
int i;
for(i=0;i<=1000;i++){//Ö÷Ìå
u[i]=INF;
}
memset(use,0,sizeof(use));
for(i=0;i<=n;i++){
u[i]=cost[0][i];
// printf("%d,\n",u[i]);
//printf("%d,,\n",n);
}
u[0]=0;
//use[0]=1;
while(1){
int x=-1,y;
for(y=1;y<=n;y++){
if(!use[y]&&(x==-1||u[y]<u[x]))x=y;
}
if(x==-1)break;
use[x]=1;
for(y=1;y<=n;y++){
u[y]=min(u[y],u[x]+cost[x][y]);
//printf("%d,,\n",u[y]);
}
}
int ans=INF;
for(i=0;i<=D-1;i++){
ans=min(ans,u[d[i]]);//之前写成了1--D所以出来的答案是零
// printf("%d\n",d[i]);
}
printf("%d\n",ans);
}
int main()
{
int i,j,a,b;
while(scanf("%d%d%d",&T,&S,&D)!=EOF){
for(i=0;i<=1000;i++){
for(j=0;j<=1000;j++){
cost[i][j]=INF;
}
cost[i][i]=0;
}
int n=0;
for(i=1;i<=T;i++){
scanf("%d%d%d",&a,&b,&t);
n=max(max(n,a),b);
cost[a][b]=cost[b][a]=t;
//n=max(n,max(a,b));
}
//printf("%d,,",n);
for(i=0;i<S;i++){
scanf("%d",&s[i]);
cost[0][s[i]]=cost[s[i]][0]=0;
}
for(i=0;i<D;i++)scanf("%d",&d[i]);
f(n,cost);

}
return 0;
}
先初始化起点与其余各点之间的距离,若无直接的联系先初始化为无穷大。
寻找与起点距离最近的点j并标记,将原本的距离d[i]与d[j]+cost[j][i]比较取最小值,在遍历所有点后,再次寻找下一个未被标记过的点,重复这个过程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最短路问题