图相关算法-最短路径

迪杰斯特拉算法(D算法)

#include<iostream>
#include<vector>
#include<limits>
using namespace std;
void ShortestPath_Dijkstra(vector<vector<int>>& arc, int numVex, vector<int>& Patharc, vector<int>& ShortPath)
{
	int k=0, MIN=INT_MAX;
	vector<bool>flag(numVex);
	for (int i = 0; i < numVex; i++)
	{
		flag[i] = false;
		ShortPath[i] = arc[0][i];
	}
	flag[0] = true;
	ShortPath[0] = 0;
	for (int v = 1; v < numVex; v++)
	{
		MIN = INT_MAX;
		for (int j = 0; j < numVex; j++)
		{
			if (!flag[j] && ShortPath[j] < MIN)
			{
				MIN = ShortPath[j];
				k = j;
			}
		}
		flag[k] = true;
		for (int i = 0; i < numVex; i++)
		{
			if (!flag[i] && arc[k][i] != INT_MAX && (arc[k][i] + MIN) < ShortPath[i])
			{
				ShortPath[i] = arc[k][i] + MIN;
				Patharc[i] = k;
			}
		}
	}
	
}
int main()
{
	//创建图
	int numVex,numEdge;
	cout << "请输入图中的点数和边数:" << endl;
	cin >> numVex >> numEdge;
	vector<vector<int>>arc(numVex, vector<int>(numVex,INT_MAX));
	cout << "请输入变得信息:" << endl;
	for (int i = 0; i < numEdge; i++)
	{
		int e1, e2, weight;
		cin >> e1 >> e2 >> weight;
		arc[e1][e2] = weight;
		arc[e2][e1] = weight;
	}
	//寻找顶点0到其他顶点的最短距离
	vector<int>Patharc(numVex);
	vector<int>ShortPath(numVex);
	ShortestPath_Dijkstra(arc, numVex, Patharc, ShortPath);
	for (int i = 1; i < numVex; i++)
	{
		cout << "节点0到节点" << i << "的最短路径为:" << ShortPath[i] << endl;
	}
	return 0;
}
  • 弗洛伊德算法(F算法)

    #include<iostream>
    #include<vector>
    #define MAX 0x0f0f0f0f
    using namespace std;
    void ShortestPath_Floyd(int numVex,vector<vector<int>>& D, vector<vector<int>>& P)
    {
    	for (int k = 0; k < numVex; k++)
    	{
    		for (int v = 0; v < numVex; v++)
    		{
    			for (int w = 0; w < numVex; w++)
    			{
    				if (D[v][w] > D[v][k] + D[k][w])
    				{
    					D[v][w] = D[v][k] + D[k][w];
    					P[v][w] = P[v][k];
    				}
    			}
    		}
    	}
    }
    int main()
    {
    	int numVex, numEdge;
    	cout << "请输入图中的点数和边数:" << endl;
    	cin >> numVex >> numEdge;
    	vector<vector<int>>D(numVex, vector<int>(numVex, MAX));
    	vector<vector<int>>P(numVex, vector<int>(numVex));
    	cout << "请输入边的信息:" << endl;
    	for (int i = 0; i < numEdge; i++)
    	{
    		int e1, e2, weight;
    		cin >> e1 >> e2 >> weight;
    		D[e1][e2] = weight;
    		D[e2][e1] = weight;
    	}
    	for (int v = 0; v < numVex; v++)
    	{
    		D[v][v] = 0;
    		for (int w = 0; w < numVex; w++)
    		{
    			P[v][w] = w;
    		}
    	}
    	//F算法 (寻找各个顶点之间的最短距离)
    	ShortestPath_Floyd(numVex,D, P);
    	cout << "各个顶点之间的最短距离为:" << endl;
    	for (int i = 0; i < numVex; i++)
    	{
    		for (int j = 0; j < numVex; j++)
    		{
    			cout << D[i][j] << " ";
    		}
    		cout << endl;
    	}
    	return 0;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值