有N个城市,M条无向边,从某个给定的起始城市出发,前往名为ROM的城市。每个城市(除了起始城市)都有一个幸福值和花费。求从起点到ROM所需要的最少花费,输出其路径。如果路径有多条,给出幸福值最大的那条。如果仍然不唯一,选择路径上的城市平均幸福值最大的那条路径。
输出花费最少的路径的数量,输出花费,输出最大幸福值,最大平均幸福值,然后输出路径。
这一题用Dijkstra最短路径。算是复习了一下Dijkstra最短路径,把。
(用时:4:25:15.83)
#include <bits/stdc++.h>
using namespace std;
struct Path {
int toIndex;
int cost;
};
map<string,int> cityMap;
void getShorest(vector<Path> cityRoad[],int n,int endIndex,vector<string> cityIndexTName,int happiness[])
{
int vis[n]= {0};
queue<int> que;
vector<int> minSPath;
int paHappiness[n]= {0};
int paCost[n];
vector<int> pre[n];
int pathNum[n]= {0};
for(int i=0; i<n; i++) {
paCost[i] = 10000000;
pathNum[i]=0;
paHappiness[i] = happiness[i];
}
int x=0;
paCost[0] = 0;
que.push(0);
paHappiness[0] = 0;
pathNum[0] = 1;
int index = 0;
int num[n] = {0};
int spath[n]= {0};
int minCost = INT_MAX;
while(!que.empty()) {
index = que.front();
que.pop();
if(index==endIndex) {
continue;
}
vis[index]=1;
for(int i=0; i<cityRoad[index].size(); i++) {
x = cityRoad[index][i].toIndex;
if(!vis[x]) {
if( paCost[x] > paCost[index] + cityRoad[index][i].cost) {
paCost[x] = paCost[index] + cityRoad[index][i].cost;
paHappiness[x] = happiness[x] + paHappiness[index];
spath[x] = index;
num[x] = num[index] +1;
pathNum[x] = pathNum[index];
} else if(paCost[x] == paCost[index] + cityRoad[index][i].cost) {
pathNum[x] += pathNum[index];
if(paHappiness[x] < happiness[x] + paHappiness[index]) {
paHappiness[x] = happiness[x] + paHappiness[index];
num[x] = num[index] + 1;
spath[x] = index;
} else if(paHappiness[x] == happiness[x] + paHappiness[index]) {
if(num[x] > num[index] +1 ) {
num[x] = num[index] + 1;
spath[x] = index;
}
}
}
}
}
int mins = INT_MAX;
int minIndex=endIndex;
for(int i=1; i<n; i++) {
if(vis[i]==0&&paCost[i]<mins&&paCost[i]!=-1) {
mins = paCost[i];
minIndex = i;
}
}
que.push(minIndex);
}
int maxAvgHa = 0;
x = endIndex;
while(spath[x]!=x) {
minSPath.push_back(x);
x = spath[x];
}
minSPath.push_back(0);
maxAvgHa = floor(1.0*paHappiness[endIndex]/ num[endIndex]);
cout<< pathNum[endIndex] <<" "<<paCost[endIndex]<<" "<<paHappiness[endIndex]<<" "<<maxAvgHa<<endl;
x= endIndex;
int first =1;
for(int i=minSPath.size()-1; i>=0; i--) {
if(first==1) {
cout<<cityIndexTName[minSPath[i]];
first = 0;
} else {
cout<<"->"<<cityIndexTName[minSPath[i]];
}
}
cout<<endl;
}
int main()
{
int n,k;
string startCityName,cityName;
cin>>n>>k>>startCityName;
cityMap[startCityName] = 0;
int cost = 0;
int happiness[n];
vector<string> cityIndexTName;
cityIndexTName.push_back(startCityName);
vector<Path> cityRoad[n];
happiness[0] = 0;
int h;
int endIndex=0;
for(int i=1; i<n; i++) {
cin>>cityName>>h;
cityIndexTName.push_back(cityName);
if(cityName=="ROM") {
endIndex = i;
}
cityMap[cityName] = i;
happiness[i] = h;
}
string ct2;
for(int i=0; i<k; i++) {
cin>>cityName>>ct2>>cost;
int x = cityMap[cityName];
int y = cityMap[ct2];
Path p1,p2;
p1.cost = cost;
p1.toIndex =y;
p2.cost = cost;
p2.toIndex =x;
cityRoad[x].push_back(p1);
cityRoad[y].push_back(p2);
}
getShorest(cityRoad,n,endIndex,cityIndexTName,happiness);
return 0;
}