# include<stdio.h>
# include<string.h>
# include<algorithm>
using namespace std;
const int maxn = 160;
const int INF = 9999;
int N, M, S, T, t;
long d[maxn]; 点到起点的距离
int map[maxn][maxn];点到点的距离
int vis[maxn];该点是否被访问
char s1[33], s2[33];存起始和终点站
char d1[33], d2[33];存读取的两站点
char vs[160][33];存已知的站点
void dijkstra(void)
{
int i, id;
for(i=0; i<t; i++)
{
d[i]=map[S][i]; //初始化d[i], 表示起点到i的时间
}
d[S]=0;
memset(vis, 0, sizeof(vis)); //初始化vis
vis[S]=1;
while(1)
{
int mins = INF;
id = -1;
for(i=0; i<t; i++) //找到离起点最近的那个点
{
if(vis[i]==0 && mins>d[i])
{
mins=d[i];
id=i;
}
}
if(mins==INF) //如果找不到就直接跳出
break;
vis[id]=1; //标记该被访问
for(i=0; i<t; i++)
{
if(vis[i]==1) continue;
d[i]=min(d[i], d[id]+map[id][i]);//如果d[id]+map[id][i]<d[i]那么更新d[i]
}
}
if(d[T]!=INF)
printf("%d\n", d[T]);
else
printf("-1\n");
}
int main(void)
{
int i, j, A, B, X, temp, flag;
while(scanf("%d", &N)!=EOF){
if(N==-1)
break;
flag=0;
for(i=0; i<150; i++)
for(j=0; j<150; j++)
map[i][j]=INF; //初始化
scanf("%s%s", s1, s2);
if(strcmp(s1, s2)==0) //如果起始和终点相同,flag置为1
{
flag=1;
}
memcpy(vs[0], s1, sizeof(s1));//将起始站放入 vs数组
memcpy(vs[1], s2, sizeof(s2));//将终点站放入 vs数组
t=2;//vs数组接下来从下标为2开始存
S=0;//起始站 vs下标为0
T=1;//终点站 vs下标为1
for(i=0; i<N; i++)
{
scanf("%s%s%d", &d1, &d2, &X); //读取d1站,d2站, d1 d2的时间
temp=1;
for(j=0; j<t; j++)
{
if(strcmp(vs[j], d1)==0) //如果d1在vs里
{
temp=0;
A=j; //那么记录A=j
break;
}
}
if(temp) //如果d1不在vs里,将d1存入vs
{
memcpy(vs[t], d1, sizeof(d1));
A=t; //记录A=t
t++;
}
temp=1;
for(j=0; j<t; j++)
{
if(strcmp(vs[j], d2)==0) //如果d2不在vs里,将d2存入vs
{
temp=0;
B = j; //记录B=j
break;
}
}
if(temp)//否则将d2存入vs
{
memcpy(vs[t], d2, sizeof(d2));
B=t; //记录B=t
t++;
}
if(map[A][B]>X) //如果X小于当前map[A][B]的值,更新map[A][b]=X
map[A][B]=map[B][A]=X;
}
if(flag==1) //如果起点和终点相同,直接输出0
printf("0\n");
else //否则就进入dijkstra
dijkstra();
}
return 0;
}
HDU2112
最新推荐文章于 2021-04-12 07:44:35 发布
本文介绍了一个使用Dijkstra算法解决最短路径问题的C语言程序。该程序通过读取输入来构建一个图,并找出两个特定节点之间的最短路径。它首先初始化图的节点和边,然后运用Dijkstra算法计算最短路径。
462

被折叠的 条评论
为什么被折叠?



