最短路径2

Posted 肥宅Sean

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路径2相关的知识,希望对你有一定的参考价值。


题目描述

N个城市,标号从0到N-1,M条道路,第K条道路(K从0开始)的长度为2^K,求编号为0的城市到其他城市的最短距离

输入描述:

第一行两个正整数N(2<=N<=100)M(M<=500),表示有N个城市,M条道路 接下来M行两个整数,表示相连的两个城市的编号

输出描述:

N-1行,表示0号城市到其他城市的最短路,如果无法到达,输出-1。

输入

4 4 1 2 2 3 1 3 0 1

输出

8 9 11

#include <iostream>
using namespace std;
#include <cstring>
#include<vector>
int map[100][100];
bool visited[100];
int cost = 1<<30; // 
int n;
vector<int> ans;
bool finish(){
    for (int i = 0;i<n;++i){
        if (!visited[i])
            return false;
    }
    return true;
}
void DFS(int now, vector<int> l) {
    if (visited[now])
        return;
    visited[now] = true;
    if(finish()) {
        if(cost > l[l.size()-1]){
            cost = l[l.size()-1];
            ans = l;
        }
        return;
    }
    for (int i = 0; i < n; ++i) {
        if (map[now][i] != -1) {
            vector<int> t = l;
            if(!l.empty())
                t.push_back(map[now][i] + l[l.size()-1]);
            else
                t.push_back(map[now][i]);
             DFS(i, t);
        }
    }
    visited[now] = false;
}
int main(){
    int m,x,y;
    cin>> n>>m;
    memset(map,-1,sizeof(map));
    for(int i = 0; i < m; ++i){
        cin >> x>> y;
        map[y][x] = map[x][y] = 1<<i;
    }

    memset(visited, false ,sizeof(visited));
    vector<int> temp;
    DFS(0, temp);
    if (ans.size() == 0){
        cout << -1;
    } else {
        for (int i = 0;i < ans.size();++i){
            cout<< ans[i]<< endl;
        }
    }
}