青云的机房组网方案(简单)



                                        青云的机房组网方案(简单)

                                                                               1000ms                                                          131072K               

青云现在要将 nnn 个机房连成一个互相连通的网络。工程师小王设计出一个方案:通过在 nnn 个机房之间铺设 n−1n-1n1 条双向的光纤,将所有的机房连接。可以假设数据在两个机房之间的光纤传输需要 111 单位时间。每个机房 iii 有一个初始值 aia_iai,当两个机房的初始值之间互质时,我们认为这两个机房之间的传输性能是非常重要的。请帮小王计算出所有数值互质的机房对之间的传输时间之和。


输入格式

第一行输入一个正整数 nnn,第二行输入 nnn 个正整数 a1...ana_1...a_na1...an,表示 nnn 个机房的初始值。

接下来输入 n−1n-1n1 行,每行输入两个数 a,ba,ba,b,表示机房 aaa 和机房 bbb 之间有一条双向网络管道。

对于简单版本:n≤500n \leq 500n5001≤ai≤501 \leq a_i \leq 501ai50

对于中等版本:n≤10000n \leq 10000n100001≤ai≤5001 \leq a_i \leq 5001ai500

对于困难版本:n≤100000n \leq 100000n100000ai≤100000a_i \leq 100000ai100000


输出格式

输出一行,表示所有初始值互质的机房对的传输时间和。


样例输入
4
1 2 3 4
1 2
2 3
3 4
样例输出
8
提示信息

对于第一组样例,每一组初始值互质的机房对的传输时间如下:

(1,2)(1,2)(1,2)111

(1,3)(1,3)(1,3)222

(1,4)(1,4)(1,4)333

(2,3)(2,3)(2,3)111

(3,4)(3,4)(3,4)111

所以,所有初始值互质的机房对的传输时间和为 1+2+3+1+1=81+2+3+1+1=81+2+3+1+1=8

题意:如题。

题目链接:青云的机房组网方案(简单)

解题思路:题目说的很清楚,要让n台电脑都连通,也就是强连通图,告诉你每台电脑的初始值,只有当两台电脑互质时才计时,已经告诉你n-1条光纤,也就是这样的两台电脑之间传输耗时1单位,关键是要求出到其他点需要跨过几台电脑,标准的Floyd算法,将每个顶点k尝试插进i->j,使得i->k->j可行,求出来这个后就在循环一次,用辗转相除法判断是否互质。

刚开始想到Flyod算法是O(n^3)不敢用,因为我以为下面困难的数据也是本题的数据,结果一直不敢下手。

代码:

//青云的机房组网方案(简单)
//链接:http://nanti.jisuanke.com/t/11132
#include
   
   
    
    
#include
    
    
     
     
#include
     
     
      
      

using namespace std;
const int N = 505;
int a[N],path[N][N],n;
int gcd(int a,int b)  //辗转相除法
{
    return b?gcd(b,a%b):a;
}
void dfs(int y,int x)
{
    for(int j=1;j<=n;j++){
        if(x != j && y!=j && path[x][j]){   //设法从y->x的路径插点,构成y->j->x的路
            if(path[y][j]>0) path[y][j]=min(path[y][j],path[y][x]+path[x][j]);
            else            path[y][j]=path[y][x]+path[x][j];     //未遍历过
        }
    }
}
int main()
{
    int i,j,ans,x,y;
    while(~scanf("%d",&n)){
        for(i=0;i
      
      
     
     
    
    
   
   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值