题目大意,有N个路口,R条路,每条路可以双向走,希望求得从第一个路口走到第N个路口需要的次最短路径。
输入:
第一行:两个正整数,R和N
第二行到第R+1行每行输入三个正整数,分别为起始路口号、终点路口号和距离。
输出:
次最短距离。
输入样例:
4 4
1 2 100
2 3 150
2 4 200
3 4 100
输入样例:
450
目前只想到,求得所有路径,然后找出次最小的距离。其中查找当前节点是否在路径中出现过,可以采用hashmap的形势,加快速度,也可以采用一个对应的n*nd'd
#include <iostream>
#include <vector>
using namespace std;
bool isIncludedInPath(vector<int> source,int target);
void findRoad(int map[],int cur,int N,vector<int> roadMap,vector<vector<int>>& distance);
int main() {
int N;
int R;
cin >> N >> R;
int map[N*N];
for(int i=0;i<N*N;i++){
map[i] = 0;
}
int first;
int end;
int dis;
for(int i=0;i<R;i++){
cin>>first>>end>>dis;
first--;
end--;
map[first * N + end] = dis;
map[end * N + first] = dis;
}
vector<vector<int>> distance;
vector<int> temp;
temp.push_back(0);
findRoad(map,0,N-1,temp,distance);
int min = INT_MAX;
int secMin = INT_MAX;
for(int i=0;i<distance.size();i++){
int sum = 0;
for(int j=0;j<distance[i].size()-1;j++){
sum += map[distance[i][j] * N + distance[i][j+1]];
}
if(sum < secMin){
secMin = sum;
if(secMin < min){
sum = min;
min = secMin;
secMin = sum;
}
}
}
cout << secMin;
return 0;
}
void findRoad(int map[],int cur,int N,vector<int> roadMap,vector<vector<int>>& distance){
if(cur == N) {
distance.push_back(roadMap);
return;
}
for(int i=0;i<N+1;i++){
if(map[cur * (N+1) + i] != 0 && !isIncludedInPath(roadMap,i)){
vector<int > temp = roadMap;
temp.push_back(i);
findRoad(map,i,N,temp,distance);
}
}
return;
}
bool isIncludedInPath(vector<int> source,int target){
for(int i=0;i<source.size();i++){
if(source[i] == target){
return true;
}
}
return false;
}