啊哈算法——求最少转机的次数

题意:小哼和小哈一起坐飞机旅游,他们现在位于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;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/geek_sun/article/details/80554334