随着一种新的称为“ThrustoZoom”的超时空宇宙飞船的发明,一种叫做“HyperCommodities”的地球与遥远的银河之间的商品进出口活动应运而生。HyperCommodities希望从Plural Z星团中的一些银河进口商品,在这些银河中的行星盛产昂贵的商品和原材料。初步的报告显示:
(1)每个银河都包含至少一个和最多26个行星,在一个银河的每个行星用A~Z中的一个字母给以惟一的标识。
(2)每个行星都专门生产和出口一种商品,在同一银河的不同行星出口不同的商品。
(3)一些行星之间有超时空货运航线连接。如果行星A和B相连,则它们可以自由贸易;如果行星C和B相连而不与A相连,则A和C之间仍可通过B进行贸易,不过B要扣留5%的货物作为通行费。这就是说,A只能收到C运出的95%的货物。一般来说,只要两个行星之间可以通过一组货运航线连接,它们就可以进行贸易,不过每个中转站都要扣留5%的所中转货物作为通行费(注意,通行费不总是等于原货物的5%)。
(4)在每个银河至少有一个行星开放一条通往地球的TrustoZoom航线。对商业来说,TrustoZoom航线和其他星际航线一样。例如,如果行星K向地球开放一条TrustoZoom航线,那么地球就可以同K自由贸易,或者同与K相连的任何行星通商,不过要被K征收通行费。
HyperCommodities已经对每个行星的主要出口商品定价(不超过10的正实数),数值越高,商品的价值越高。在本地市场,越值钱的商品获利也越高。问题是要确定如果要考虑通行费时,哪个行星的产品价值最高。
输入格式:
输入包含若干银河的描述。每个银河的描述开始的第1行是一个整数N,表示银河的行星数。接下来的N行每行包含一个行星的描述,即:
(1)一个代表行星的字母;
(2)一个空格;
(3)以d.dd的形式给出该行星的出口商品的价值;
(4)一个空格;
(5)一个包含字母和(或)字符“*”的字符串;字母表示一条通往该行星的货运航线;“*”表示该行星向地球开放TrustoZoom货运航线。
输出格式:
对每个银河的描述,输出一个字母P表示在考虑通行费的前提下,行星P具有最高价值的出口商品。如果拥有最高价值的出口商品的行星多于一个,只需输出字母最小的行星。
输入输出样例
输入 |
输出 |
1 F 0.81 * 5 E 0.01 *A D 0.01 A* C 0.01 *A A 1.00 EDCB B 0.01 A* |
F A |
#include <iostream> #include <string> #define NUM 26 #define MAX 1000 using namespace std; int main() { int n; cin>>n; char city[n]; double value[n]; //char link[n][NUM]; string link[n]; double maxvalue[n]; for(int i=0;i<n;i++) { cin>>city[i]>>value[i]>>link[i]; } int map[n+1][n+1]; for(int i=0;i<=n;i++) { for(int j=0;j<=n;j++) { map[i][j]=MAX; } } for(int j=0;j<n;j++) { string s=link[j]; int len=s.length(); for(int i=0;i<len;i++) { if(s[i]=='*') { map[n][j]=1; map[j][n]=1; continue; } for(int k=0;k<n;k++) { //cout<<1<<endl; if(city[k]==s[i]) { map[j][k]=1; // cout<<j<<" "<<k<<endl; break; } } } } /* for(int i=0;i<=n;i++) { for(int j=0;j<=n;j++) { cout<<map[i][j]<<" "; } cout<<endl; }*/ int minpath[n+1];//最短路径 bool visit[n+1];//是否选中 for(int i=0;i<=n;i++) { minpath[i]=MAX; visit[i]=false; } int start=n; minpath[start]=0; while(1) { visit[start]=true; int k; for(k=0;k<n;k++) { if(visit[k]==false) { break; } } if(k==n) { break; } int min=MAX; int j; for(int i=0;i<n;i++) { int len=map[start][i]+minpath[start]; minpath[i]=len<minpath[i]?len:minpath[i]; if(minpath[i]<min&&visit[i]==false) { j=i; } } start=j; } for(int i=0;i<n;i++) { if(minpath[i]==1) { maxvalue[i]=value[i]; continue; } int j=minpath[i]; while(j>1) { maxvalue[i]=value[i]*0.95; j--; } } double max=0; int tag; for(int i=0;i<n;i++) { if(maxvalue[i]>max) { max=maxvalue[i]; tag=i; } //cout<<maxvalue[i]<<endl; } cout<<city[tag]<<endl; }