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;    
}     


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值