bzoj1529[POI2005]ska Piggy banks

【题目大意】

n头奶牛m种语言,每种奶牛分别掌握一些语言。问至少再让奶牛多学多少种语言,才能使得它们能够直接或间接交流?

【思路】

(n+m)个点,奶牛学会某种语言就合并它和语言的节点。并查集维护联通块,答案为联通块个数-1。水,可是我跳坑了。

我一开始做法是设总的联通块有(n+m)个,然后没合并一次减去1。其实这样是不可行的,因为我们只需要考虑奶牛(即节点1..n)有几个联通块。有可能一些语言根本没有任何奶牛掌握……

 #include<bits/stdc++.h>
using namespace std;
const int MAXN=++;
int n,m,t;
int u[MAXN],h[MAXN],appear[MAXN]; int find(int x)
{
int tmp=x;
while (u[tmp]!=tmp) tmp=u[tmp];
while (u[x]!=x)
{
int temp=u[x];
u[x]=tmp;
x=temp;
}
return tmp;
} void union_set(int fa,int fb)
{
if (h[fa]>=h[fb])
{
u[fb]=fa;
if (h[fa]==h[fb]) h[fa]++;
}
else u[fa]=fb;
} void solve()
{
scanf("%d%d",&n,&m);
for (int i=;i<=(n+m);i++) u[i]=i,h[i]=;
for (int i=;i<=n;i++)
{
int k,lang;
scanf("%d",&k);
for (int j=;j<=k;j++)
{
scanf("%d",&lang);
int fa=find(i),fb=find(lang+n);
if (fa!=fb) union_set(fa,fb);
}
}
int t=;
memset(appear,,sizeof(appear));
for (int i=;i<=n;i++)
{
int fa=find(i);
if (appear[fa]==) t++,appear[fa]=;
}
printf("%d",t-);
} int main()
{
solve();
return ;
}

POJ1182-[NOI01]食物链

【题目大意】

动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。
现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。
有人用两种说法对这N个动物所构成的食物链关系进行描述:
第一种说法是"1 X Y",表示X和Y是同类。
第二种说法是"2 X Y",表示X吃Y。
此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。
1) 当前的话与前面的某些真的话冲突,就是假话;
2) 当前的话中X或Y比N大,就是假话;
3) 当前的话表示X吃X,就是假话。
你的任务是根据给定的N(1 <= N <= 50,000)和K句话(0 <= K <= 100,000),输出假话的总数。

【思路】

*我上一次写这道题是在一年半之前。哦。

用0表示当前节点和u[i]同类,1表示当前节点i吃u[i],2表示u[i]吃当前节点i。

我们设一个v,对于题目中的输入,当为1时,v=0,当为2时,v=1。

显然如果要三个节点a、b、c,其中u[b]=c,u[a]=b,如果要压缩为u[a]=c,那么rank[a]=(rank[a]+rank[b])%3。

然后其他推一推,详见程序吧..

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN=+;
int rank[MAXN],u[MAXN];
int n,k,ans; int find(int x)
{
if (x!=u[x])
{
int tmp=u[x];
u[x]=find(u[x]);
rank[x]=(rank[x]+rank[tmp])%;
}
return u[x];
} void init()
{
ans=;
scanf("%d%d",&n,&k);
for (int i=;i<=n;i++) rank[i]=,u[i]=i;
} void solve()
{
for (int i=;i<=k;i++)
{
int d,x,y;
scanf("%d%d%d",&d,&x,&y);
if (x>n||y>n||((d==) && (x==y)))
{
ans++;
continue;
}
int fx=find(x),fy=find(y);
int v=(d==)?:;
if (fx!=fy)
{
u[fx]=fy;
rank[fx]=(rank[y]+v-rank[x]+)%;
}
else
if (rank[x]!=(rank[y]+v)%) ans++;
}
printf("%d",ans);
} int main()
{
init();
solve();
return ;
}

【并查集&&带权并查集】BZOJ3296&&POJ1182的更多相关文章

  1. 浅谈并查集&种类并查集&带权并查集

    并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...

  2. 种类并查集——带权并查集——POJ1182;HDU3038

    POJ1182 HDU3038 这两个题比较像(一类题目),属于带权(种类)并查集 poj1182描绘得三种动物种类的关系,按照他一开始给你的关系,优化你的种类关系网络,最后看看再优化的过程中有几处矛 ...

  3. Poj1182 食物链(并查集/带权并查集)

    题面 Poj 题解 这里采用并查集的补集. \(x\)表示同类集合,\(x+n\)表示敌人集合,\(x+n\times2\)表示敌人的敌人集合. 如果当前给出的是一对同类关系,就判断\(x\)是否吃\ ...

  4. POJ 1182 食物链 [并查集 带权并查集 开拓思路]

    传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit  ...

  5. codeforces 687D Dividing Kingdom II 带权并查集(dsu)

    题意:给你m条边,每条边有一个权值,每次询问只保留编号l到r的边,让你把这个图分成两部分 一个方案的耗费是当前符合条件的边的最大权值(符合条件的边指两段点都在一个部分),问你如何分,可以让耗费最小 分 ...

  6. AcWing:238. 银河英雄传说(带权并查集)

    有一个划分为N列的星际战场,各列依次编号为1,2,…,N. 有N艘战舰,也依次编号为1,2,…,N,其中第i号战舰处于第i列. 有T条指令,每条指令格式为以下两种之一: 1.M i j,表示让第i号战 ...

  7. POJ 1703 Find them, Catch them(带权并查集)

    传送门 Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42463   Accep ...

  8. [NOIP摸你赛]Hzwer的陨石(带权并查集)

    题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...

  9. poj1417 带权并查集 + 背包 + 记录路径

    True Liars Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2713   Accepted: 868 Descrip ...

随机推荐

  1. [转]CNN 中千奇百怪的卷积方式大汇总

    https://www.leiphone.com/news/201709/AzBc9Sg44fs57hyY.html 推荐另一篇很好的总结:变形卷积核.可分离卷积?卷积神经网络中十大拍案叫绝的操作. ...

  2. 利用正则表达式去除所有html标签,只保留文字

    后台将富文本编辑器中的内容返回到前端时如果带上了标签,这时就可以利用这种方法只保留文字. 标签的格式有以下几种 1.<div class="test"></div ...

  3. 已知可生成0~4的rand5(),实现生成0~6的rand7()

    若已知生成0~6的rand7(),求生成0~4的rand5(),则一个方法就是不断生成0~7的数,直到这个数满足0~4就返回. int rand5(){ int res; do{ res = rand ...

  4. 60、二叉搜索树的第k个结点

    一.题目 给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 二.解法 package algorithm ...

  5. 微信小程序入坑之自定义组件

    前言 最近接触微信小程序,再次之前公司用的前端框架是vue ,然后对比发现,开发小程序是各种限制,对于开发者非常不友好.各种槽点太多,完全吐槽不过来,所以在此不多说,打算下次专门写一篇文章吐槽一下.本 ...

  6. 洛谷P3378堆

    传送门啦 #include <iostream> #include <cstdio> #include <cstring> #include <algorit ...

  7. java多线程-读写锁原理

    Java5 在 java.util.concurrent 包中已经包含了读写锁.尽管如此,我们还是应该了解其实现背后的原理. 读/写锁的 Java 实现(Read / Write Lock Java ...

  8. jboss各种测试方式归类

      不跨工程访问(如:HBase) 跨工程访问(如:Business) 不部署到服务器上 部署到服务器上 不部署到服务器上 部署到服务器上 Junit测试 实例化直接调用 true true Fals ...

  9. 程序设计实习MOOC / 程序设计与算法(三)第一周测验

    作业题: 7. 填空(2分)简单的swap 通过码是 ( 请参考公告中的“关于编程作业的说明”完成编程作业(请注意,编程题都要求提交通过码,在openjudge上提交了程序并且通过以后,就可以下载到通 ...

  10. 【洛谷】P2000 拯救世界

    题解 小迪的blog : https://www.cnblogs.com/RabbitHu/p/9178645.html 请大家点推荐并在sigongzi的评论下面点支持谢谢! 掌握了小迪生成函数的有 ...