Note
Code
#include<bits/stdc++.h>
using namespace std;
const int INF=1e9;
int n,k,cnt=2;
int weight[205],graph[205][205],dist[205];
vector<int> temp,ans;
bool vis[205]={false};
vector<int> pre[205];
map<string,int> toID;
map<int,string> toname;
int cnt_route=0,min_cost=0,max_happy=-1;
int getid(string s){
if(toID[s]==0) toID[s]=cnt++;
return toID[s];
}
void dijkstra(int s){
fill(dist,dist+205,INF);
dist[s]=0;
for(int i=0;i<cnt;i++){
int u=-1,min=INF;
for(int j=0;j<cnt;j++){
if(vis[j]==false&&dist[j]<min){
min=dist[j];
u=j;
}
}
if(u==-1) return ;
vis[u]=true;
for(int j=0;j<cnt;j++){
if(vis[j]==false&&graph[u][j]!=INF){
if(dist[u]+graph[u][j]<dist[j]){
dist[j]=dist[u]+graph[u][j];
pre[j].clear();
pre[j].push_back(u);
}
else if(dist[u]+graph[u][j]==dist[j])
pre[j].push_back(u);
}
}
}
}
void dfs(int start,int end){
if(start==end){
int cnt_happy=0;
cnt_route++;
for(int i=temp.size()-1;i>=0;i--)
cnt_happy+=weight[temp[i]];
if(cnt_happy>max_happy){
max_happy=cnt_happy;
temp.push_back(start);
ans=temp;
temp.pop_back();
}
return ;
}
temp.push_back(end);
for(int i=0;i<pre[end].size();i++)
dfs(start,pre[end][i]);
temp.pop_back();
return ;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("data.txt","r",stdin);
#endif
fill(graph[0],graph[0]+205*205,INF);
int happy,cost;
string start,city;
string c1,c2;
scanf("%d %d",&n,&k);
cin>>start;
toID[start]=1;
toname[1]=start;
for(int i=1;i<n;i++){
cin>>city;
scanf("%d",&happy);
int id=getid(city);
toname[id]=city;
weight[id]=happy;
}
for(int i=0;i<k;i++){
cin>>c1>>c2;
scanf("%d",&cost);
int id1=getid(c1),id2=getid(c2);
graph[id1][id2]=cost;
graph[id2][id1]=cost;
}
dijkstra(1);
dfs(1,toID["ROM"]);
cost=0;
for(int i=ans.size()-1;i>0;i--){
int id1=ans[i],id2=ans[i-1];
cost+=graph[id1][id2];
}
int avg=max_happy/(ans.size()-1);
printf("%d %d %d %d\n",cnt_route,cost,max_happy,avg);
for(int i=ans.size()-1;i>=0;i--){
printf("%s",toname[ans[i]].c_str());
if(i!=0) printf("->");
}
return 0;
}