邻接矩阵 逻辑结构分为两部分: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算法不可以计算负权值最短路径。