,
★实验任务
正如你所知道的 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 的时间)。
★数据输出
正如你所知道的 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;
}