//我们假设所有边的长度都是1,每一个线段表示一个转机,求最少转机就是求最短路径而已
//深度优先和广度优先的方法都可以,但是广度优先更适合所有边的权重一样的情况
#include<iostream>
using namespace std;
struct node
{
int num;//当前城市的编号
int step;
};
struct node que[10000];
int i,j,n,m,a,b,cur,book[100],e[100][100],q,p;
int head,tail,flag;
int bfs(int cur)// 当前正在访问的节点编号
{
head=1;
tail=1;
que[tail].num=p;//从1号顶点出发,将1号顶点加入队列
que[tail].step=0;
tail++;
book[p]=1;
flag=0;
while(head<tail)
{
cur=que[head].num;//当前正在访问的节点编号
for(i=1;i<=n;i++)
{
//判断从顶点cur到顶点i是否右有边,并判断顶点i是否已经访问过
if(e[cur][i]==1&&book[i]==0)
{
que[tail].num=i;
que[tail].step=que[head].step+1;
tail++;
book[i]=1;
}
//如果tail等于n+1,则表明所有的顶点都被访问,
if(tail==q+1)//为什么是q+1,因为tail是指向队列的末尾的下一个元素的位置,元素从1-q
return que[tail-1].step;
}
head++;
}
}
int main()
{
int ans;
cin>>n>>m>>p>>q;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j)
e[i][j]=0;
else
e[i][j]=99999;//假设99999为正无穷 ,表示两个点之间没有连线
}
}
for(i=1;i<=m;i++)
{
cin>>a>>b;
e[a][b]=1;
e[b][a]=1;
}
ans=bfs(p);
cout<<ans<<endl;
return 0;
}
最少转机问题
最新推荐文章于 2022-04-22 16:52:00 发布