Codeforces Round #250 (Div. 1) B 并查集
2014-08-18 15:08
344 查看
坑!神坑!深坑!,WA了几十把,最终答案 (ans * 2)/(n * 1.0 * (n - 1)) 要是写成(ans * 2)/(n *(n - 1)*1.0)就是WA,不明白为啥,愤怒的我 全改成double就可以了,若前面变量用了int的 答案必须是前一种写法,
题目不是特别难,没啥思路画一画就有思路了,10^5的n去扫肯定是要超时的,那就想想一次性的10^5,发想通过m是可以的,建边,边权就是两端点中小的那个,然后对最终答案的种数进行分析,发现其实就是 每次你要连接的两块连通块的个数相乘就是最终你包含的这些边要走的次数,这样求和,最终答案再乘以2就好了,题目下面的hint其实那个 个数乘以2貌似有些暴露.
题目不是特别难,没啥思路画一画就有思路了,10^5的n去扫肯定是要超时的,那就想想一次性的10^5,发想通过m是可以的,建边,边权就是两端点中小的那个,然后对最终答案的种数进行分析,发现其实就是 每次你要连接的两块连通块的个数相乘就是最终你包含的这些边要走的次数,这样求和,最终答案再乘以2就好了,题目下面的hint其实那个 个数乘以2貌似有些暴露.
int n,m; int nnum[100005 + 55]; int fa[100005 + 55]; int sum[100005 + 55]; typedef struct Node { int fro,to,nex; int val; Node(int a = 0,int b = 0,int c = 0):fro(a),to(b),val(c){} }; Node edge[100005 + 55]; void init() { memset(nnum,0,sizeof(nnum)); memset(edge,0,sizeof(edge)); for(int i=0;i<100005;i++)fa[i] = i; for(int i=0;i<100005;i++)sum[i] = 1; } bool input() { while(scanf("%d %d",&n,&m) == 2) { for(int i=1;i<=n;i++)scanf("%d",&nnum[i]); int q = m; int cnt = 0; for(int i=0;i<m;i++) { int u,v; scanf("%d %d",&u,&v); edge[i] = Node(u,v,min(nnum[u],nnum[v])); } return false; } return true; } bool cmp(Node x,Node y) { return x.val > y.val; } int find(int x) { if(fa[x] != x)fa[x] = find(fa[x]); return fa[x]; } void cal() { sort(edge,edge + m,cmp); double ans = 0; for(int i=0;i<m;i++) { int dx = find(edge[i].fro); int dy = find(edge[i].to); if(dx != dy) { ans += (double)edge[i].val * sum[dx] * sum[dy]; fa[dx] = dy; sum[dy] += sum[dx]; } } printf("%.6lf\n",(ans * 2)/(n * 1.0 * (n - 1))); } void output() { } int main () { while(true) { init(); if(input())return 0; cal(); output(); } return 0; }
相关文章推荐
- Codeforces Round #400 (Div. 1 + Div. 2, combined) D. The Door Problem 开关--并查集
- Educational Codeforces Round 33 (Rated for Div. 2)【C】【并查集】
- Codeforces Round #363 (Div. 2)D. Fix a Tree(并查集)
- Codeforces Round #385 (Div. 2)C. Hongcow Builds A Nation【并查集+贪心】好题~
- Codeforces Round #254 (Div. 2) DZY Loves Chemistry【并查集基础】
- Codeforces Round #400 (Div. 1 + Div. 2, combined) D. The Door Problem 开关--并查集
- Codeforces Round #396 (Div. 2)D. Mahmoud and a Dictionary(带权并查集)
- Codeforces Round #181 (Div. 2) B. Coach 带权并查集
- Codeforces Round #400 (Div. 1 + Div. 2, combined) D. The Door Problem 开关--并查集
- Codeforces Round #376 (Div. 2) C 并查集
- 并查集Codeforces Round #134 (Div. 1), problem: (A) Ice Skating
- Codeforces Round #360 (Div. 1) D. Dividing Kingdom II 并查集求奇偶元环
- Codeforces Round #400 (Div. 1 + Div. 2, combined) D. The Door Problem 开关--并查集
- Codeforces Round #345 (Div. 2) E. Table Compression 并查集
- Codeforces Round #360 (Div. 1) D Dividing Kingdom II(并查集+暴力)
- Codeforces Round #250 (Div. 1) D. The Child and Sequence
- Codeforces Round #400 (Div. 1 + Div. 2, combined) D. The Door Problem 开关--并查集
- Codeforces Round #250 (Div. 2) (ABCD题解)
- Codeforces Round #170 (Div. 2) C. Learning Languages【并查集】
- Codeforces Round #400 (Div. 1 + Div. 2, combined) D. The Door Problem 开关--并查集