用到的是floyd算法求最短路。
我的AC代码:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int h[200][200]; //相当于无向图的邻接矩阵(无中转点时)
int inf=9999999;
int main()
{
int n,m,x,y;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
h[i][j]=1;
}
while(m--)
{
cin>>x>>y;
h[x][y]=inf;
h[y][x]=inf;
}
if(h[1][n]==inf) //表示1->n直通的这条路是铁路,火车只需1就到了。所以只需看汽车的。
{
for(int i=1;i<=n;i++) //中转点的变化
{
for(int a=1;a<=n;a++)
{
for(int b=1;b<=n;b++)
{
if(h[a][i]+h[i][b]<h[a][b])
h[a][b]=h[a][i]+h[i][b];
}
}
}
cout<<h[1][n];
return 0;
}
else
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(h[i][j]==inf)
h[i][j]=1;
else
h[i][j]=inf;
}
for(int i=1;i<=n;i++) //中转点的变化
{
for(int a=1;a<=n;a++)
{
for(int b=1;b<=n;b++)
{
if(h[a][i]+h[i][b]<h[a][b])
h[a][b]=h[a][i]+h[i][b];
}
}
}
cout<<h[1][n];
return 0;
}
}
注意
只需要一个二维数组就可以实现floyd算法了,它是对于每一个中转点,都是在上一次的中转点所得到的最短路数组的基础上再进行比较优化,有一点“动态规划”的意思。