摘要: 并查集……#include int f[1005],q,w,n,m;int sf(int x){return x==f[x]?x:f[x]=sf(f[x]);}int main(){ while(~scanf("%d",&n)){ if(n==0)break; scanf("%d",&m); for(int i=1;i<=n;i++)f[i]=i; for(int i=0;i<m;i++){ scanf("%d%d",&q,&w); f[sf(q)]=sf(w); }int... 阅读全文
posted @ 2014-02-17 20:54 forever97 阅读(142) 评论(0) 推荐(0) 编辑
摘要: 题目大意:排座位,给出关系,B要在A后x位,给出许多的关系,求出错误的个数。题解:加权并查集,注意关系不要弄混了。#include int n, m, data, ans; int f[200010],r[200010]; int sf(int x){ int t; if(x==f[x])return f[x]; t=f[x]; f[x]=sf(f[x]); r[x]+=r[t]; return f[x]; } int Union(int x, int y){ int a, b; a=sf(x); b=sf(y); ... 阅读全文
posted @ 2014-02-17 20:39 forever97 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 题解:用加权并查集,将小的节点作为父节点,每一次压缩路径时传递和的信息,如果已有信息存在,判断是否是正确的即可:#include int n, m, data, ans; int f[200010],sum[200010]; int sf(int x){ int t; if(x==f[x])return f[x]; t=f[x]; f[x]=sf(f[x]); sum[x]+=sum[t]; return f[x]; } int Union(int x, int y){ int a, b; a=sf(x); b=sf(y... 阅读全文
posted @ 2014-02-17 20:06 forever97 阅读(166) 评论(0) 推荐(0) 编辑