The London Olympic Games
The London Olympic Games
Description
伦敦奥运会正在如火如荼的进行着,孙扬觉得他们总是游直线有点单调,于是向奥组委提议说,把赛道的隔离物全部拿走,在游泳池中固定一定数量的浮球,某些浮球之间可以直达,球球之间有一定的距离;某些浮球之间不可以直达。选手可以选择从任意一球出发,用最短的时间触摸到所有的浮球的那个就获得冠军(在这里为了使问题简化,如果多次在两个球之间来回的游,我们只计算一次的时间,比如从a球游到b球经过一次,又从b球游到a球,第二次经过相同的路径,但是我们只计算一次。)。真没想到奥组委竟然同意了,并说在下一届奥运会巴西奥运会上将首次加入该比赛。为了为国争光,请你帮帮孙扬吧!
Sample Input
Sunyang 13.5 Piaotaihuan 10.9 Sunyue 11.8 Sujian 11.6 Xiaotian 11.99 Shumeng 10.95 Yibing 10.98 Shiyong 12.95 London Beijing 12.88 London Paris 12.98 Beijing Paris 13.67 Paris NewYork 14.86 Beijing NewYork 15.34 Paris Taibei 16.54 NewYork Taibei 17.78 end
Sample Output
1st: Sunyang 4.24 2st: Shiyong 4.42 3st: Xiaotian 4.78 4st: Sunyue 4.85 5st: Sujian 4.94 6st: Yibing 5.21 7st: Shumeng 5.23 8st: Piaotaihuan 5.25
分析:
很明显是让求最小生成树,就用krustal算法吧
而这里想考的就是如何将字符串转换成数字,那就用map吧
# include<iostream> # include<algorithm> # include<cstring> # include<cstdio> # include<map> # include<string> using namespace std; map<string,int>mymap; int parent[10000]; struct node { double v; char name[30]; }Per[9]; struct dist { int st; int en; double dis; }w[10000]; bool cmp(struct node a,struct node b) { if(a.v>b.v)return true; else if(a.v==b.v&&strcmp(a.name,b.name)<0)return true; return false; } bool cmp1(struct dist a,struct dist b) { if(a.dis<b.dis)return true; return false; } void init() { int i; for(i=0;i<10000;i++) { parent[i]=i; } } int find(int k) { if(k!=parent[k]) { parent[k]=find(parent[k]); } return parent[k]; } double krua(int cnt)//借助并查集 { double ans=0.0; int i,s_root,e_root; for(i=0;i<cnt;i++) { s_root=find(w[i].st); e_root=find(w[i].en); if(s_root!=e_root) { parent[s_root]=e_root; ans+=w[i].dis; } } return ans; } int main() { char str1[25],str2[25]; int cnt=0,i,loop; double add=0.0; init(); for(i=0;i<8;i++) { cin>>Per[i].name>>Per[i].v; } sort(Per,Per+8,cmp);//sort排序要简单点,用qsort如下 loop=1; while(cin>>str1&&strcmp(str1,"end")) { cin>>str2>>w[cnt].dis; if(mymap[str1]==0)//用map转换成数字,一开始用字典树转换,挺麻烦的 { mymap[str1]=loop++; } if(mymap[str2]==0) { mymap[str2]=loop++; } w[cnt].st=mymap[str1]; w[cnt].en=mymap[str2]; cnt++; } sort(w,w+cnt,cmp1);//这步是krustal算法必不可少的,开始遗漏了这步,检查了好久 add=krua(cnt); for(i=0;i<8;i++) { printf("%dst: %s %0.2lf\n",i+1,Per[i].name,add/Per[i].v); } return 0; }
浙公网安备 33010602011771号