主要是考虑怎么把字符串转换为数字
直接用两个map相互查找就行了
这种题就是见过了就知道怎么做
没什么技术含量
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
int n,k;
string st;
const int maxn=210;
const int INF=1e9+5;
map<string,int> City2Index;
map<int,string> Index2City;
int weight[maxn];
int G[maxn][maxn]; //耗时
int d[maxn]; //耗时最短
bool vis[maxn]={false};
int num=0; //最短路径有多少条
vector<int> path,tempPath;
vector<int> pre[maxn];
void Dijkstra(int s){
fill(d,d+maxn,INF);
d[s]=0;
for(int i=0;i<n;i++){ //n个顶点
int u=-1,Min=INF; //每个中间点使源点能到达的最短路径的顶点
for(int j=0;j<n;j++){
if(vis[j]==false && d[j] < Min){
u = j;
Min = d[j];
}
}
if(u==-1) return;
vis[u]=true;
for(int v=0;v<n;v++){
if(vis[v]==false && G[u][v]!=INF){
if(G[u][v] + d[u] < d[v]){
d[v]=G[u][v] + d[u];
pre[v].clear();
pre[v].push_back(u); //把u设为前驱节点
}else if(G[u][v] + d[u] == d[v]){
pre[v].push_back(u); //直接加在v的后面,表示还有另一个前驱
}
}
}
}
}
int maxhappy=0;
double avehappy;
void DFS(int v) {
if(v==0){
tempPath.push_back(v);
num++;
weight[0]=0;
int tempmax=0;
double tempave=0;
for(int i=tempPath.size()-1;i>=0;i--){ //从0开始到终点
int id=tempPath[i];
tempmax+=weight[id];
}
tempave= tempmax*1.0/(tempPath.size()-1);
if(tempmax > maxhappy){
maxhappy = tempmax;
avehappy = tempave;
path = tempPath;
}else if(tempmax == maxhappy && tempave > avehappy){
avehappy = tempave;
path = tempPath;
}
tempPath.pop_back();
return;
}
tempPath.push_back(v);
for(int j=0;j<pre[v].size();j++){
DFS(pre[v][j]);
}
tempPath.pop_back();
}
int main(){
cin>>n>>k>>st;
string st1,st2,str;
City2Index[st]=0; //把城市转换为索引
Index2City[0]=st; //把索引转换为城市
fill(G[0],G[0]+maxn*maxn,INF);
for(int i=1;i<n;i++){ //点权幸福值 此处把所有城市都存下来了
cin>>str>>weight[i];
City2Index[str]=i;
Index2City[i]=str;
}
int cost;
for(int i=0;i<k;i++){ //边权距离
cin>>st1>>st2;
int c1=City2Index[st1],c2=City2Index[st2]; //先找出城市对应的索引
cin>>cost;
G[c1][c2]=cost;
G[c2][c1]=cost; //无向图
}
Dijkstra(0);
int rom=City2Index["ROM"]; //终点
DFS(rom);
printf("%d %d %d %d\n",num,d[rom],maxhappy,int(avehappy));
for(int i=path.size()-1;i>=0;i--){
cout<<Index2City[path[i]];
if(i>0) cout<<"->";
}
cout<<endl;
return 0;
}