最少转机

本文介绍了一种基于图论的最短路径算法实现方法。通过使用结构体存储顶点信息和距离,配合队列实现广度优先搜索(BFS),有效地找出两点间的最短路径。文章详细展示了算法的实现过程,并提供了完整的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<bits/stdc++.h>
struct note
{
int x;
int s;
};
int main()
{
struct note que[2501];
int e[51][51]={0},book[51]={0};
int head,tail;
int i,j,n,m,a,b,cur,start,end,flag=0;
scanf("%d %d %d %d",&n,&m,&start,&end);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) e[i][j]=0;
else e[i][j]=99999999;
for(i=1;i<=m;i++)
{
scanf("%d %d",&a,&b);
e[a][b]=1;
e[b][a]=1;
}
head=1;
tail=1;
que[tail].x=start;
que[tail].s=0;
tail++;
book[1]=start;
while(head<tail)
{
cur=que[head].x;
for(j=1;j<=n;j++)
{
if(e[cur][j]!=99999999&&book[j]==0)
{
que[tail].x=j;
que[tail].s=que[head].s+1;
tail++;
book[j]=1;
}
if(que[tail].x=end)
{
flag=1;
break;
}
}
if(flag==1)
break;
head++;
}
printf("%d",que[tail-1].s);
return 0;
}
好的,我会根据你的要求进行回答。下面是对你的问题的回答: 这是一个典型的图论问题,可以使用广度优先搜索(BFS)算法来解决。BFS 是一种遍历图的算法,从起点开始,依次访问与之相邻的节点,直到找到目标节点或遍历完整个图。 在这个问题中,我们可以使用邻接矩阵来表示图,即使用一个二维数组来表示每个节点之间的连接关系。如果节点 i 和节点 j 之间存在边,则 `adjMatrix[i][j]` 的值为 1,否则为 0。 下面是实现 `int minFlightChanges(int** adjMatrix, int numVertices, int startVertex, int targetVertex)` 函数的步骤: 1. 初始化一个队列,将起始城市作为第一个元素入队。 2. 初始化一个数组,用于记录每个节点是否已经被访问过。初始时,所有节点都未被访问过。 3. 初始化一个数组,用于记录从起始城市到每个城市的最少转机次数。初始时,所有值都为无穷大,除了起始城市的值为 0。 4. 从队列中取出第一个元素,将其标记为已访问。 5. 遍历与当前城市相邻的所有城市,如果该城市未被访问过,则将其入队,并更新从起始城市到该城市的最少转机次数。 6. 重复步骤 4 和步骤 5,直到队列为空或找到目标城市。 7. 如果找到了目标城市,则返回从起始城市到目标城市的最少转机次数,否则返回 -1。 下面是完整的代码实现: ``` #include <queue> #include <limits.h> using namespace std; int minFlightChanges(int** adjMatrix, int numVertices, int startVertex, int targetVertex) { queue<int> q; q.push(startVertex); bool visited[numVertices] = {false}; visited[startVertex] = true; int dist[numVertices]; for (int i = 0; i < numVertices; i++) { dist[i] = INT_MAX; } dist[startVertex] = 0; while (!q.empty()) { int curr = q.front(); q.pop(); for (int i = 0; i < numVertices; i++) { if (adjMatrix[curr][i] == 1 && !visited[i]) { q.push(i); visited[i] = true; dist[i] = dist[curr] + 1; if (i == targetVertex) { return dist[i]; } } } } return -1; } ``` 该函数的时间复杂度为 O(V^2),其中 V 表示节点的数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值