图的遍历(最小转机数)——dfs&&bfs

本文探讨了如何通过DFS和BFS算法确定从起点到终点的飞机行程中转机次数最少的方法。

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

如题:

就是求从某个起点开始然后到终点的过程中,要使转飞机的次数最少,那么应该怎样安排飞机的行程。

一法:dfs法

#include<stdio.h>
int e[101][101],book[101],n,m,startx,starty,min=99999999;
//cur代表当前的飞机站点,dis则代表转机的次数; 
void dfs(int cur,int dis){
	if(dis>min) return;
	if(cur==starty){
		if(dis<min) min=dis;
		return;
	}
	for(int i=1;i<=n;i++){
		if(book[i]==0&&e[cur][i]!=99999999){
			book[i]=1;
			dfs(i,dis+1);
			book[i]=0;
		}
	}
}
int main(){
	int a,b;
	scanf("%d%d%d%d",&n,&m,&startx,&starty);
	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;
		}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&a,&b);
		e[a][b]=1;
		e[b][a]=1;
	}
	book[startx]=1;
	dfs(startx,0);
	printf("%d\n",min);
}


 

二法:bfs法

#include<stdio.h>
struct node{
	int x;		//城市编号 
	int s;		//转机次数 
};
int main(){
	struct node que[2501];
	int e[51][51]={0},book[51]={0};
	int head,tail;
	int i,j,n,m,a,b,cur,startx,starty,flag=0;
	scanf("%d%d%d%d",&n,&m,&startx,&starty);
	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=tail=1;
	que[tail].x=startx;
	que[tail].s=0;
	book[startx]=1;
	tail++;
	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-1].x==starty){
				flag=1;
				break;
			}
		}
		if(flag)  break;
		head++;
	}
	printf("%d\n",que[tail-1].s);
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值