邻接矩阵和Bellman-Ford算法 HUD1874

邻接矩阵 逻辑结构分为两部分:V和E集合。因此,用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵。

vector<pair<int ,int>>E[maxn];

或者自己去定义一个结构体。

 

题目: hud1874

#include<iostream>
using namespace std;
#define maxn 205
int n,m;
int mp[maxn][maxn];  //邻接矩阵 

int main()
{
	while(cin>>n>>m)			//城镇和道路数目 
	{
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(i==j)mp[i][j]=0;  //邻接矩阵初始化
				else mp[i][j]=1e9; 
			}
		} 
		for(int i=0;i<m;i++)		//建立邻接矩阵 
		{
			int x,y,z;
			cin>>x>>y>>z;
			mp[x][y]=min(z,mp[x][y]);
			mp[y][x]=min(z,mp[y][x]);    //cuz双向 
		}
		int s,t;
		cin>>s>>t;
		for(int k=0;k<n;k++)
		{
			for(int i=0;i<n;i++)
			{
				for(int j=0;j<n;j++)
				{
					mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
				}
			}
		}
		if(mp[s][t]==1e9)cout<<-1<<endl;
		else cout<<mp[s][t]<<endl;
	}  
	return 0;
} 

Bellman-Ford算法可以大致分为三个部分
第一,初始化所有点。每一个点保存一个值,表示从原点到达这个点的距离,将原点的值设为0,其它的点的值设为无穷大(表示不可达)。
第二,进行循环,循环下标为从1到n-1(n等于图中点的个数)。在循环内部,遍历所有的边,进行松弛计算。
第三,遍历途中所有的边(edge(u,v)),判断是否存在这样情况:d(v)> d (u) + w(u,v)则返回false,表示途中存在从源点可达的权为负的回路。

 

因此:bellman—ford算法不可以计算负权值最短路径。

 

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/qq_35962520/article/details/81629143
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞