在这里插入代码片
`
``
#include<bits/stdc++.h>
using namespace std;
#define maxl 1000000009
int mapp[100][100],q[100],vis[100],path[100];//mapp记录联通路,q记录从源点的值,vis记录每个点是否做过源点 ,path记录路径;
int n1,n2;
void Dijkstra(int begin)
{
int k;
for(int i=1;i<=n1;i++)
{
q[i]=mapp[begin][i];
vis[i]=0;
path[i]=-1;
}
vis[begin]=1;
q[begin]=0;//将begin作为源点
for(int i=1;i<=n1;i++)
{
int min=maxl;
for(int j=1;j<=n1;j++)
{
if(min>q[j]&&!vis[j])
{
min=q[j];
k=j;
}
}//寻找最近距源点最近的点
// path[k]=
vis[k]=1;
for(int j=1;j<=n1;j++)
{
if(q[j]>q[k]+mapp[j][k]&&!vis[j])
{
q[j]=q[k]+mapp[j][k];
path[j]=k;
// printf(" %d\n",k);
}
}
//更新权值
}
}
int main()
{
//int n;
printf("请输入有多少个顶点\n");
scanf("%d",&n1);
printf("请输入有多少条边\n");
scanf("%d",&n2);
//n1点数,n2边数
for(int i=1;i<=n1;i++)
{
for(int j=1;j<=n1;j++)
{
if(i!=j)
mapp[i][j]=maxl;
else
mapp[i][j]=0;
}
}
for(int i=0;i<n2;i++)
{
int a,b,pq;
scanf("%d%d%d",&a,&b,&pq);
mapp[b][a]=pq;
mapp[a][b]=pq;
}
int n,m;
printf("请输入起点与终点");
scanf("%d %d",&n,&m);
Dijkstra(n);
printf("%d\n",q[m]);
//for(int i=1;i<=n1;i++)
// printf(" %d",path[i]);
int q=path[m];
printf("%d",m);
while(q!=-1)
{
printf("->%d",q);
q=path[q];
}
}
/*
4
5
1 2 2
1 3 10
1 4 6
2 4 19
3 4 28
2 4
*/
/*
11
22
0 1 2
0 2 8
0 3 1
1 2 6
2 3 7
1 4 1
2 4 5
2 5 1
2 6 2
2 6 9
4 7 2
4 8 9
5 8 6
6 8 3
6 9 1
7 8 7
8 9 1
7 10 9
8 10 2
9 10 4
4 5 3
5 6 4
1 10
*/
//算法时间复杂度O(n^2);改进方法 使用优先队列,不能有负边值
迪杰斯特拉算法
最新推荐文章于 2021-10-18 17:08:41 发布