Sins of a Solar Empire P5

来源:互联网 发布:梯度下降算法 权重 编辑:程序博客网 时间:2024/04/27 19:11
,实验任务
正如你所知道的 s_sin 是一个贪玩的不得了的小 P 孩 QAQ,你也知道他最近很喜欢玩一
个叫做太阳帝国的原罪的策略游戏去年他已经和疯狂的 AI 交战了整整一年。而现在,战斗
的序幕又要拉开了。
已知有 n 个行星编号 1 到 N, s_sin 所在的行星编号为 1,其他 N-1 行星为敌方所占据。
现在 s_sin 想要占领所有的星球,但是由于战力不足,每攻占一个星球 都得回到他自己的
星球(也就是编号为 1 的星球)补给,才能继续征战,而且最后都征战完成后得回到编号为
1 的星球。现在一些星球之间的可以通过传送阵传送到其他星球,传送需要花费一定的时间。
s_sin 只能通过这些传送阵在行星间进行传送,假设 s_sin 每次回到星球的补给时间忽略不
计,现想问至少需要多久 s_sin 才能占领所有行星并回到 1 号行星。
数据输入
输入第一行为一个正整数N (2 < =N < =1000), 表示一共有N 个行星
接下来n 行,每行 n 个非负整数,第 i 行第 j 个数表示从 i 星球传送到 j 星球需要花费
的时间。(0<=时间值<=100000)数据保证aij=aji(即从i j 的时间等于从 j i 的时间)
数据输出

输出一个整数表示占领所有行星,需要的最少的时间。

输入示例   输出示例
4             8
0 1 1 4
1 0 4 1
1 4 0 1
4 1 1 0


            #include<iostream>    using namespace std;        int cost[1000][1000];        int d[1000];    int used[1000];    int n;        int min(int x,int y){        return x<y?x:y;    }        int main(){        int q=2147483647;        int ans=0;        scanf("%d",&n);        fill(d,d+n,2147483647);        fill(used,used+n,0);        for(int i=0;i<n;i++){            for(int j=0;j<n;j++){                scanf("%d",&cost[i][j]);            }        }        d[0]=0;        int v,u;        while(true){             v=-1;             for(u=0;u<n;u++){                if(!used[u]&&(v==-1||d[u]<d[v]))  v=u;             }             if(v==-1)break;             used[v]=1;                             for(u=0;u<n;u++){                d[u]=min(d[u],d[v]+cost[v][u]);             }        }                for(u=0;u<n;u++){            ans+=d[u];        }        printf("%d\n",ans*2);        return 0;    }     


0 0
原创粉丝点击