本文主要是介绍Sins of a Solar Empire P5,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
, ★实验任务正如你所知道的 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;
}
这篇关于Sins of a Solar Empire P5的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!