#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
using namespace std;
const int INF=1000000;
int g[210][210];
int vis[210];
int dis[210];
int happy[210];
vector<int>pre[210];
vector<int> tempPath,path;
int n,k;//城市数,路径数
map<string,int>sti;
map<int,string>its;
void Dijkstra(int x){
fill(vis,vis+210,0);
fill(dis,dis+210,INF);
dis[x]=0;
for(int i=0;i<n;i++){
int u=-1;
int MIN=INF;
for(int j=0;j<n;j++){
if(vis[j]==0&&dis[j]<MIN){
u=j;
MIN=dis[j];
}
}
// printf("u:%d\n",u);
if(u==-1)return;
vis[u]=1;
for(int v=0;v<n;v++){
if(vis[v]==0&&g[u][v]!=INF){
if(dis[u]+g[u][v]<dis[v]){
dis[v]=dis[u]+g[u][v];
pre[v].clear();
pre[v].push_back(u);
}else if(dis[u]+g[u][v]==dis[v]){
pre[v].push_back(u);
}
}
}
}
}
int pathNum=0;
int minCost=INF,maxHappiness=0,count1;
void DSF(int x){
if(x==0){
tempPath.push_back(x);
int cost=0,happiness=0;
for(int i=0;i<tempPath.size()-1;i++){//路线是倒序的,终点->起点
cost+=g[tempPath[i]][tempPath[i+1]];
happiness+=happy[tempPath[i]];
}
if(cost<minCost){//计算路径条数
pathNum=1;
}else if(cost==minCost){
pathNum++;
}
if(cost<minCost){//找花费最少的
path=tempPath;
minCost=cost;
maxHappiness=happiness;
count1=tempPath.size()-1;
}else if(cost==minCost&&happiness>maxHappiness){//在花费相同时找happiness大的
path=tempPath;
maxHappiness=happiness;
count1=tempPath.size()-1;
}else if(cost==minCost&&happiness==maxHappiness&&tempPath.size()<count1){//在happiness相同时找路径上城市数少的
path=tempPath;
count1=tempPath.size()-1;
}
tempPath.pop_back();
return;
}
tempPath.push_back(x);
for(int i=0;i<pre[x].size();i++){
DSF(pre[x][i]);
}
tempPath.pop_back();
}
int cityCount=0; //城市数
int change(string a){
if(sti.find(a)==sti.end()){//还未加入
sti[a]=cityCount;
its[cityCount]=a;
return cityCount++;
}else{
return sti[a];
}
}
int main(){
fill(happy,happy+210,0);
fill(g[0],g[0]+210*210,INF);
scanf("%d%d",&n,&k);
string start;
cin>>start;
change(start);
string a,b;
int c;
for(int i=0;i<n-1;i++){
cin>>a>>c;
happy[change(a)]=c;
}
for(int i=0;i<k;i++){
cin>>a>>b>>c;
g[sti[a]][sti[b]]=c;
g[sti[b]][sti[a]]=c;
}
Dijkstra(0);
DSF(sti["ROM"]);
/* for(int i=0;i<n;i++){
printf("%d:",i);
for(int j=0;j<pre[i].size();j++){
printf("%d ",pre[i][j]);
}
printf("\n");
}*/
printf("%d %d %d %d\n",pathNum,minCost,maxHappiness,maxHappiness/count1);
for(int i=path.size()-1;i>=0;i--){
cout<<its[path[i]];
if(i!=0){
cout<<"->";
}
}
printf("\n");
}
PAT --- A1087 --- Figure
Guess you like
Origin blog.csdn.net/weixin_46265246/article/details/105246102
Recommended
Ranking