题目:Click
/*广搜最短路径*/
#include<iostream>
#include<algorithm>
#include<cmath>
#include <vector>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=405;
int n,m;
int dis[maxn];
int connect[maxn][maxn];
int bfs(int val){
queue<int> q;
memset(dis,-1,sizeof(dis));
dis[1]=0;
q.push(1);
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=1;i<=n;i++){
if(connect[x][i]==val&&dis[i]==-1){
dis[i]=dis[x]+1;
q.push(i);
}
}
}
return dis[n];
}
int main(){
scanf("%d%d",&n,&m);
int tx,ty;
for(int i=0;i<m;i++){
scanf("%d%d",&tx,&ty);
connect[tx][ty]=connect[ty][tx]=1;
}
printf("%d\n",bfs(1-connect[1][n])); //铁路相连,搜公路;公路相连,搜铁路
return 0;
}
Floyd算法
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int map[500][500];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
memset(map,0,sizeof(map));
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
map[x][y]=map[y][x]=1;
}
if(map[1][n]==1)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
map[i][j]=1-map[i][j];
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
if(map[j][i]==0||map[i][k]==0)continue;
if(map[j][k]==0)map[j][k]=map[j][i]+map[i][k];
map[j][k]=min(map[j][i]+map[i][k],map[j][k]);
}
}
}
if(map[1][n]==0)
{
printf("-1\n");
}
else printf("%d\n",map[1][n]);
}
}
转载:https://blog.csdn.net/u010885899/article/details/50042811
转载:https://blog.csdn.net/mengxiang000000/article/details/52261778