银河贸易问题

随着一种新的称为“ThrustoZoom”的超时空宇宙飞船的发明,一种叫做“HyperCommodities”的地球与遥远的银河之间的商品进出口活动应运而生。HyperCommodities希望从Plural Z星团中的一些银河进口商品,在这些银河中的行星盛产昂贵的商品和原材料。初步的报告显示:

1)每个银河都包含至少一个和最多26个行星,在一个银河的每个行星用A~Z中的一个字母给以惟一的标识。

2)每个行星都专门生产和出口一种商品,在同一银河的不同行星出口不同的商品。

3)一些行星之间有超时空货运航线连接。如果行星AB相连,则它们可以自由贸易;如果行星CB相连而不与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;
}

猜你喜欢

转载自www.cnblogs.com/lzy20001230/p/12925880.html