单源最短路
所有顶点对间最短路
- Floyd-Warshall
#include<cstdio>
int e[10010][10010];//二维数组e用于记录图
int main()
{
int n,m,u,v,w;//n表示有多少个点,m表示有多少条边
//u为一条边的起点,v为一条边的终点,w为一条边的权值
const int inf=99999999;//表示无穷大
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)//初始化图
for(int j=1;j<=n;j++)
if(i==j)
e[i][j]=0;
else e[i][j]=inf;
for(int i=1;i<=m;i++)//读入图
{
scanf("%d %d %d",&u,&v,&w);
e[u][v]=w;
}
//算法核心,通过中转点来松弛从起点i到终点j的边
for(int k=1;k<=n;k++)//选择中转点
for(int i=1;i<=n;i++)//选择起点
for(int j=1;j<=n;j++)//选择终点
if(e[i][j]>e[i][k]+e[k][j])
e[i][j]=e[i][k]+e[k][j];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%10d",e[i][j]);
}
printf("\n");
}
return 0;
}
单源最短路
- Dijkstra
#include<iostream>
using namespace std;
int e[1010][1010],dis[1010],book[1010];//二维数组e用于记录图,
//数组dis[i]用于记录i点到源点的距离
//数组book[i]用于标记i点
int inf=99999999;
int main()
{
int n,m,u,v,w;//n表示顶点数目,m表示边数目
//u表示起点,v表示终点,w表示边的权值
cin>>n>>m;
//初始化
for(int i=1;i<=n;i++)
{
dis[i]=e[1][i];
book[i]=0;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;
for(int i=1;i<=m;i++)
{
cin>>u>>v>>w;
e[u][v]=w;
}
//算法核心
book[1]=1;//选择1点为源点
int min,k;
//最多确定n-1次,即每次最少确定一个点
for(int i=1;i<=n-1;i++)
{
//选择最短边
min=inf;
for(int j=1;j<=n;j++)
{
if(book[j]==0&&e[i][j]<min)
{
min=e[i][j];
k=j;//用k记录最短边的终点
}
}
book[k]=1;//标记k点表示从源点到k点的边不用再松弛
//松弛
for(int j=1;j<=n;j++)
{
if(e[k][j]<inf)
{
if(dis[j]>dis[k]+e[k][j])
dis[j]=dis[k]+e[k][j];
}
}
}
for(int i=1;i<=n;i++)
cout<<dis[i]<<"\n";
return 0;
}