PAT甲级1087
题目大意:给出总城市数n,总道路数k以及起始城市。接下来n-1行给出除起点外每个城市的幸福指数,最后k行给出每两个城市之间的路程花费。首先要求从起点到ROM的最短距离,如果这样的最短距离有多条就统计总共有多少条。然后第二指标要求路径上的总幸福指数最高,如果总幸福指数也一样则输出平均幸福指数最高的一条路径(起始点幸福指数为0,算平均的时候必须挖去这个点)。
主要用到的Dijkstra+DFS,先求出起始点到每个城市的最短路径并且保存路径,然后DFS查找。这里总路径条数不能简单自加,要根据中间点u来更新路径条数。
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
#define INF 100000000
#define MAXN 210
using namespace std;
string destination="ROM";
int n,k,maxhappiness=0;
double maxaverage=0;
string start;
bool visit[MAXN];
int cost[MAXN][MAXN],happiness[MAXN],mincost[MAXN],totalroute[MAXN];
vector<int> path[MAXN],tmppath,path2;
map<string,int> city;
map<int,string> city2;
void init(){
for(int i=0;i<n;i++)
fill(cost[i],cost[i]+n,INF);
fill(visit,visit+n,false);
fill(mincost,mincost+n,INF);
fill(totalroute,totalroute+n,1);
}
void Dijkstra(int index){
mincost[index]=0;
for(int i=0;i<n;i++){
int u=-1,min_cost=INF;
for(int j=0;j<n;j++){
if(!visit[j]&&min_cost>mincost[j]){
u=j;
min_cost=mincost[j];
}
}
if(u==-1) return ;
visit[u]=true;
for(int j=0;j<n;j++){
if(!visit[j]&&cost[u][j]<INF&&cost[u][j]+mincost[u]<=mincost[j]){
if(cost[u][j]+mincost[u]<mincost[j]){
totalroute[j]=totalroute[u];
mincost[j]=cost[u][j]+mincost[u];
path[j].clear();
path[j].push_back(u);
}else{
totalroute[j]+=totalroute[u];
path[j].push_back(u);
}
}
}
}
}
void DFS(int index){
if(index==0){
tmppath.push_back(index);
int tmpmaxhappiness=0;
double tmpmaxaverage=0;
for(int i=tmppath.size()-1;i>=0;i--){
int id=tmppath[i];
tmpmaxhappiness+=happiness[id];
}
if(tmpmaxhappiness>maxhappiness){
maxhappiness=tmpmaxhappiness;
maxaverage=maxhappiness*1.0/(tmppath.size()-1);
path2=tmppath;
}else if(tmpmaxhappiness==maxhappiness){
tmpmaxaverage=maxhappiness*1.0/(tmppath.size()-1);
if(tmpmaxaverage>maxaverage){
maxaverage=tmpmaxaverage;
path2=tmppath;
}
}
tmppath.pop_back();
return ;
}
tmppath.push_back(index);
for(int i=0;i<path[index].size();i++){
DFS(path[index][i]);
}
tmppath.pop_back();
}
int main(){
string tmpcity1,tmpcity2;
int tmphappiness,length;
scanf("%d%d",&n,&k);
init();
cin>>start;
city[start]=0;
city2[0]=start;
for(int i=1;i<n;i++){
cin>>tmpcity1;
scanf("%d",&tmphappiness);
city[tmpcity1]=i;
city2[i]=tmpcity1;
happiness[i]=tmphappiness;
}
for(int i=0;i<k;i++){
cin>>tmpcity1>>tmpcity2;
scanf("%d",&length);
cost[city[tmpcity1]][city[tmpcity2]]=length;
cost[city[tmpcity2]][city[tmpcity1]]=length;
}
Dijkstra(0);
DFS(city[destination]);
printf("%d %d %d %d\n",totalroute[city[destination]],mincost[city[destination]],maxhappiness,(int)maxaverage);
for(int i=path2.size()-1;i>=0;i--){
cout<<city2[path2[i]];
if(i!=0) printf("->");
}
system("pause");
return 0;
}