如图,共有4个城市8个公路,希望知道任意两点间的最短距离(多源最短路径)
首先就得把这一大堆路线转换成一个表,二维数组即可
例如第一行第二列的2就表示从1到2的距离为2,无穷则表示没路,不能直接到达,(1,1),(2,2)等对角线均为0,当然就是自己到自己的距离为0啦…
具体构建图的过程如下
cin>>n>>m;//n个点,m条边
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j) a[i][j]=0;
else a[i][j]=v;//除对角线外其他先设为无穷大
}
}
for(int i=1;i<=m;i++)
{
cin>>t1>>t2>>t3;
a[t1][t2]=t3;//写入自己定义的边
}
啊哈上讲的很好了已经
//核心代码
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]>a[i][k]+a[k][j])
{
a[i][j]=a[i][k]+a[k][j];
}
}
}
}
完整代码如下
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int v=99;
int main()
{
int a[100][100];
int n,m,t1,t2,t3;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j) a[i][j]=0;
else a[i][j]=v;
}
}
for(int i=1;i<=m;i++)
{
cin>>t1>>t2>>t3;
a[t1][t2]=t3;
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]>a[i][k]+a[k][j])
{
a[i][j]=a[i][k]+a[k][j];
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
例子
4 8
1 2 2
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 3 12