#include<algorithm> #include<map> #include<vector> #include<string> #include<iostream> #include<stack> using namespace std; #define max 203 #define inf 0x3f3f3f3f int dis[max][max]={0}; int n=0; int visited[max]={0}; int pre[max]={0}; int same[max]={0}; int happies[max]={0}; int final_happies[max]={0}; int step[max]={0}; map<int,string> city_name; map<string,int> city_num; stack<string> ans; void dijstrak(int s)//s是起点 { same[0]=1; visited[s]=1; for(int i=0;i<n;i++) { int min=inf; int mark=-1; for(int j=0;j<n;j++) {//找到离起点距离最小的 if(visited[j]==0&&dis[s][j]<min) { min=dis[s][j]; mark=j; } } if(mark==-1) return ; visited[mark]=1;//marked for(int i=0;i<n;i++) {//updata if(visited[i]==1) continue; int p_dis=dis[s][i]; int n_dis=dis[s][mark]+dis[mark][i]; if(p_dis>n_dis) //如果新的距离(有了最小值节点mark之后的更新导致)小于之前的距离 { same[i]=same[mark]; dis[s][i]=dis[s][mark]+dis[mark][i]; pre[i]=mark; final_happies[i]=final_happies[mark]+happies[i]; step[i]=step[mark]+1; } if(p_dis==n_dis) { same[i]+=same[mark]; if(final_happies[i]<final_happies[mark]+happies[i])//现在的顶点权值较大 { pre[i]=mark; final_happies[i]=final_happies[mark]+happies[i]; step[i]=step[mark]+1; } if(final_happies[i]==final_happies[mark]+happies[i])//如果顶点权值相等,第三步判断平均顶点权值 { if(step[i]>(step[mark]+1)) //之前的步数多,那就更新 { pre[i]=mark; step[i]=step[mark]+1; } } } } } } int main() { //初始化距离都为无穷大 for(int i=0;i<max;i++) for(int j=0;j<max;j++){ dis[i][j]=inf; dis[j][i]=inf; dis[i][i]=inf; dis[j][j]=inf; } int k=0; string s; cin>>n>>k>>s; //n城市数,k路数,s开始城市 city_name[0]=s; string citystr; int happy=0; //存城市的幸福值: for(int i=1;i<n;i++) { cin>>citystr>>happy; city_name[i]=citystr; city_num[citystr]=i; happies[i]=happy; final_happies[i]=happy; step[i]=1; //总步数 same[i]=1; //相同最短路数量 } string city1,city2; int cost=0; //存城市之间的距离 for(int i=0;i<k;i++){ cin>>city1>>city2>>cost; int j=city_num[city1]; int b=city_num[city2]; dis[j][b]=cost; dis[b][j]=cost; } dijstrak(0); int ROM_num=city_num["ROM"]; int index=ROM_num; string path; path+=s;//"HZH" ans.push("ROM"); while(pre[index]!=0)//不断找前驱,然后就入栈 {//入栈其实是倒着的路 string pathcity=city_name[pre[index]]; ans.push(pathcity); index=pre[index]; } //出栈 while(!ans.empty()){ path+="->"; path+=ans.top(); ans.pop(); } cout<<same[ROM_num]<<" "<<dis[0][ROM_num]<<" "<<final_happies[ROM_num]<<" "<<final_happies[ROM_num]/step[ROM_num]<<endl; cout<<path<<endl; return 0; }