#include <iostream>
using namespace std;
const int INF = 9999; //定义正无穷,表示没有边
int main()
{
int e[10][10],book[10],dis[10],i,j,n,m,t1,t2,t3,u,v,min;
cin>>n>>m; //n为顶点个数,m为边的数量
//初始化
for(i = i;i <= n;i++)
{
for(j = 1;j <= n;j++)
{
if(i == j)
{
e[i][j] = 0;
}
else
{
e[i][j] = INF;
}
}
}
//读入边
for(i = 1;i <= m;i++)
{
cin>>t1>>t2>>t3;
e[t1][t2] = t3;
}
//初始化dis数组,这里是1号顶点到其余各个顶点的初始路程
for(i = 1;i <= n;i++)
{
dis[i] = e[1][i];
}
//book数组初始化,book数组用于标记该顶点是否是已经选出的顶点
for(i = 1;i <= n;i++)
{
book[i] = 0; //0表示不在松弛的顶点中
}
book[1] = 1; //求从1顶点到各个顶点的路径最短
//算法核心代码
for(i = 1;i <= n - 1;i++)
{
//找到离1号顶点最近的顶点
min = INF;
for(j = 1;j <= n;j++)
{
if(book[j] == 0 && dis[j] < min) //最近的判断标志
{
min = dis[j];
u = j;
}
}
book[u] = 1; //u顶点离1号顶点最近,将u顶点加入到P集合中
for(v = 1;v <= n;v++)
{
if(e[u][v] < INF)
{
if(dis[v] > dis[u] + e[u][v])
{
dis[v] = dis[u] + e[u][v];
}
}
}
}
//输出最终结果
for(i = 1;i <= n;i++)
{
cout<<dis[i]<<"\t";
}
cout<<endl;
return 0;
}
地杰斯特拉算法
最新推荐文章于 2023-12-07 11:12:22 发布