(BFS遍历 邻接矩阵)最少转机
题意:小哼和小哈一起坐飞机旅游,他们现在位于start号城市,目标是end号城市,可是start号城市没有到end号城市直航,
不过他们收集了很多航班信息,现在他们要找出转机次数最少的方案。
输入样例:
5 7 1 5
1 2
1 3
2 3
2 4
3 4
3 5
4 5
第一行的5表示有5个城市(编号为1~5),7表示有7条航线,1表示起始城市,5表示目标城市,接下来的每行“a b”,表示a,b之间有航线,也就是a,b之间可以相互到达。
输出样例:
2
#include <cstdio> #include <string.h> #include <iostream> #include <algorithm> #include <sstream> #include <math.h> #include <queue> using namespace std; const int inf=0x7fffffff; const long long mod=1e9+7; const double PI=acos(-1); int n,m,start,end; int ans=9999999; bool vis[105]; int e[105][105]; struct node{ int s; int d; node(int ss,int dd){ s=ss; d=dd; } }; void init(){ //初始化邻接矩阵 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]=99999999; } } } int bfs(int pos){ queue<node> q; vis[pos]=1; //设置起点被遍历 q.push(node(pos,0)); //放入队列起点 while(!q.empty()){ node now=q.front(); //now为此时遍历的点 q.pop(); for(int i=1;i<=n;i++){ //找可以和 now 连通的点 if(e[now.s][i]!=99999999&&!vis[i]){ //和 now 连通则标记 并加入队列 q.push(node(i,now.d+1)); vis[i]=1; } if(now.s==end){ //找到终点直接退出 return q.back().d; } } } return -1; } int main() { int x,y; cin>>n>>m>>start>>end; init(); for(int i=0;i<m;i++){ //输入边 cin>>x>>y; e[x][y]=1; e[y][x]=1; } cout<<bfs(start); return 0; }