城市换乘线路问题

来源:互联网 发布:java简单学生管理系统 编辑:程序博客网 时间:2024/04/29 09:19

华为机试
设有 n 个城市, 编号为 0 ~ n - 1, m 条单向航线的七点和终点由输入提供, 寻找一条换乘次数最少的线路方案。
输入为 第一行 三个整数 n, m, v 表示城市数, 单项航线数 和起点城市。 以下 m 行每行两个整数,
表示一条边的起点和终点。
输出 共 n - 1 行, 分别是从起点城市 v 到其他 n - 1 个城市最少换乘次数, 按照城市序号从小到大顺序输出, 不能抵达时输出 -1
样例输入
3 2 0
0 1
1 2
样例输出
1
2

样例输入
4 4 0
0 1
1 2
1 3
2 1
样例输出
1
2
2

思路:
用一个二维数组构建城市之间的航线 例如 城市0 到其他城市的航线保存在 line[0] 中,然后深度优先遍历

#include<iostream>#include<vector>#include<algorithm>using namespace std;vector <vector<int> >res; //找寻目标城市,若找到,则把路线保存进res中void findLine(vector<vector<int> > line, vector<int> temp, int v, int dst) {    if (v == dst) {        temp.push_back(v);        res.push_back(temp);        return;    }    temp.push_back(v);    for (int i = 0; i < line[v].size(); ++i) {        //已经经过的城市就直接忽略        if(find(temp.begin(), temp.end(), line[v][i]) == temp.end())            findLine(line, temp, line[v][i], dst);    }}void main() {    int n, m, v;    while (cin >> n >> m >> v) {        vector<vector<int> > line(n);        for (int i = 0; i < m; ++i) {            int a, b;            cin >> a >> b;            line[a].push_back(b);        }        for (int i = 0; i < n; ++i) {            if (i == v)                continue;            //遍历各个航线            for (int j = 0; j < line[v].size(); ++j) {                vector<int> temp;                findLine(line, temp, line[v][j], i);            }            if (res.size() > 0) {                //找到最短航线                int min = res[0].size();                for (int i = 1; i < res.size(); ++i) {                    if (res[i].size() < min)                        min = res[i].size();                }                cout << min << endl;                res.clear();            }            else                cout << -1 << endl;        }    }}
0 0