迪杰斯特拉算法

在这里插入代码片
`
``
#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);改进方法 使用优先队列,不能有负边值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值