如题:
就是求从某个起点开始然后到终点的过程中,要使转飞机的次数最少,那么应该怎样安排飞机的行程。
一法: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);
}