#include <stdio.h>
#include <stack>
#include <string.h>
#include <iostream>
using namespace std;
#define INF 65535
int a[101][101];
int d[101];
int p[101];
void Init_and_Input(int n,int m)/*初始化_输入函数*/
{
int i,j,x,y,t;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=INF;
for(i=1;i<=n;i++)
d[i]=p[i]=INF;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&t);
a[x][y]=a[y][x]=t;
}
}
void Dijkstra(int n,int s)/*核心函数*/
{
int v[101],i,j,k,mi;
memset(v,0,sizeof(v));
d[s]=0;
for(j=1;j<=n;j++)
{
mi=INF;//必须要写在这,不能写在for函数外面,因为每轮都需要找出最小值,每轮都要赋初值的
for(i=1;i<=n;i++)
if(!v[i]&&d[i]<mi)
{
mi=d[i];
k=i;
}
v[k]=1;
for(i=1;i<=n;i++)
if(!v[i]&&d[k]+a[k][i]<d[i])
{
d[i]=d[k]+a[k][i];
p[i]=k;
}
}
}
int main()
{
int n,m,s,en,k;
stack<int> pre;//用栈的结构对p[]输出路径
freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
Init_and_Input(n,m);
scanf("%d%d",&s,&en);
Dijkstra(n,s);
k=en;//k的作用是保存终点符号en,不然在输出路径的过程中en的值就改变了
while(k!=s)
{
pre.push(k);
k=p[k];
}
pre.push(s);
while(pre.size()>1)
{
printf("%d->",pre.top());
pre.pop();
}
printf("%d\n",pre.top());
printf("%d\n",d[en]);
fclose(stdin);
}
又见Dijkstra!(面试上机版)
最新推荐文章于 2024-06-18 17:40:11 发布