PAT.1030 Travel Plan - Dijikstra
题目链接
思路和PAT.1018基本是一样的,先Dijikstra求所有可能的最短路,然后dfs求所有最短路里代价最小的一条。
题解
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct city{
int num;
int dis;
bool operator < (const city &a) const{
if(dis > a.dis) return true;
else return false;
}
};
int cityCnt,roadCnt,start,s,d,l,c,dest,dis[505][505],cost[505][505],vis[505],minDis[505],minCost = 0x3f3f3f3f;
vector<int> neighbors[505];
vector<int> preCity[505];
vector<int> res;
priority_queue<city> citys;
void dfs(int city,int currentCost,vector<int> path){
if(city == start){
if(currentCost < minCost){
minCost = currentCost;
res = path;
}
return;
}
for(int pc : preCity[city]){
path.push_back(pc);
dfs(pc,currentCost + cost[pc][city],path);
path.pop_back();
}
}
int main(){
cin>>cityCnt>>roadCnt>>start>>dest;
memset(minDis,0x3f3f3f3f,sizeof(minDis));
for(int i = 0 ; i < roadCnt ; ++i){
cin>>s>>d>>l>>c;
dis[s][d] = dis[d][s] = l;
cost[s][d] = cost[d][s] = c;
neighbors[s].push_back(d);
neighbors[d].push_back(s);
}
citys.push((city){start,0});
while(!citys.empty()){
city currentCity = citys.top();
citys.pop();
if(vis[currentCity.num] == 1) continue;
vis[currentCity.num] = 1;
for(int nextCity : neighbors[currentCity.num]){
if(dis[currentCity.num][nextCity] + currentCity.dis < minDis[nextCity]){
minDis[nextCity] = dis[currentCity.num][nextCity] + currentCity.dis;
preCity[nextCity].clear();
preCity[nextCity].push_back(currentCity.num);
citys.push((city){nextCity,minDis[nextCity]});
}else if(dis[currentCity.num][nextCity] + currentCity.dis == minDis[nextCity]){
preCity[nextCity].push_back(currentCity.num);
}
}
}
//find the path with least cost;
dfs(dest,0,{dest});
for(auto itr = res.rbegin() ; itr != res.rend() ; ++itr){
cout<<*itr<<' ';
}
cout<<minDis[dest]<<' '<<minCost;
}