赞
踩
青云的机房组网方案(简单)
1000ms 131072K
青云现在要将 nnn 个机房连成一个互相连通的网络。工程师小王设计出一个方案:通过在 nnn 个机房之间铺设 n−1n-1n−1 条双向的光纤,将所有的机房连接。可以假设数据在两个机房之间的光纤传输需要 111 单位时间。每个机房 iii 有一个初始值 aia_iai,当两个机房的初始值之间互质时,我们认为这两个机房之间的传输性能是非常重要的。请帮小王计算出所有数值互质的机房对之间的传输时间之和。
输入格式
第一行输入一个正整数 nnn,第二行输入 nnn 个正整数 a1...ana_1...a_na1...an,表示 nnn 个机房的初始值。
接下来输入 n−1n-1n−1 行,每行输入两个数 a,ba,ba,b,表示机房 aaa 和机房 bbb 之间有一条双向网络管道。
对于简单版本:n≤500n \leq 500n≤500,1≤ai≤501 \leq a_i \leq 501≤ai≤50;
对于中等版本:n≤10000n \leq 10000n≤10000, 1≤ai≤5001 \leq a_i \leq 5001≤ai≤500;
对于困难版本:n≤100000n \leq 100000n≤100000,ai≤100000a_i \leq 100000ai≤100000。
输出格式
输出一行,表示所有初始值互质的机房对的传输时间和。
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
-
-
-
-
-
-
-
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。