题意:小哼和小哈一起坐飞机旅游,他们现在位于1号城市,目标是5号城市,可是1号城市没有到5号城市直航,不过他们收集了很多航班信息,现在他们要找出转机次数最少的方案。
第一行的5表示有5个城市(编号为1~5),7表示有7条航线,1表示起始城市,5表示目标城市,接下来的每行“a b”,表示a,b之间有航线,也就是a,b之间可以相互到达。
样例:
5 7 1 5
1 2
1 3
2 3
2 4
3 4
3 5
4 5
第一种方法利用广度优先搜索
#include <iostream>
using namespace std;
struct node
{
int x; //表示城市的编号
int s; //表示运动的距离
};
//全局变量自动初始化为0
int startPosition,endPosition,visited[10],martrix[25][25],m,n;//m,n分别代表城市的数量和航线的数量。
struct node myQueue[20];
int main()
{
int head = 1,tail = 1;
cin >> m >> n >> startPosition >> endPosition;
for(int k = 1;k <= n;k++)
{
int i,j;
cin >> i >> j;
martrix[i][j] = 1;
}
myQueue[tail].x = startPosition;
myQueue[tail].s = 0;
visited[tail++] = 1;
while(head != tail)
{
int v = myQueue[head].x;
if(v == endPosition)
{
break;
}
for(int i = 1;i <= n;i++)
{
if(martrix[v][i] == 1&&visited[i] == 0)
{
myQueue[tail].x = i;
myQueue[tail].s = myQueue[head].s + 1;
visited[tail++] = 1;
}
}
head++;
}
for(int i = 1;i < tail - 1;i++)
{
cout << myQueue[i].x << " " << myQueue[i].s << endl;
}
return 0;
}
第二种方法利用深度优先搜索
#include <iostream>
using namespace std;
//全局变量自动初始化为0
int startPosition,endPosition,visited[10],martrix[25][25],m,n;//m,n分别代表城市的数量和航线的数量。
int min_dis = 999999;
void Dfs(int v,int distance);
int main()
{
cin >> m >> n >> startPosition >> endPosition;
for(int k = 1;k <= n;k++)
{
int i,j;
cin >> i >> j;
martrix[i][j] = 1;
}
Dfs(startPosition,0);
cout << min_dis;
return 0;
}
void Dfs(int v,int distance)
{
if(v == endPosition)
{
if(min_dis > distance)
{
min_dis = distance;
}
return;
}
for(int i = 1;i <= m;i++)
{
if(martrix[v][i] == 1&&visited[i] == 0)
{
visited[i] = 1;
Dfs(i,distance + 1);
visited[i] = 0;
}
}
}