最短路径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;
}
}
}
以上是关于最短路径2的主要内容,如果未能解决你的问题,请参考以下文章