冗余关系_并查集

冗余关系

蒜头最近在沉迷小说,尤其是人物关系复杂的言情小说。它看到的人物关系描述得很的麻烦的时候觉得非常蒜疼,尤其是任务关系里有冗余的时候。什么是冗余关系呢?

这篇小说里有n句描述人物关系的句子,描述了n个人的关系。

每条句子的定义是这样的:

X<->Y    它的意思是:X认识Y,Y也认识X

我们认为小说中的人物关系是具有传递性的,假如A认识B,B认识C,则A也认识C。

冗余关系的定义:就是即使没有这条人物关系,原来的人物之间的所有关系也照样成立。

比如:

小说中已经提到了A认识B,B也认识C。在此之后再讲A认识C就是一个冗余的关系。

小蒜头想求出一共有多少条冗余关系,你能帮帮它吗?

输入格式:

第一行两个整数,表示句子数量n(1<=n<=1000),表示人数m(1<=m<=1000)。

接下来n行,每行两个数,表示一组人物关系。

输出格式:

一个整数,表示冗余关系的数目。

样例输入

3 3
1 2
1 3
2 3

样例输出

1解题思路:并查集可以用用数组来表示图,每一个连通子图都选出一个队长,然后构造成树状的。。。。  此题要输出冗余关系,如果有两个数的队长是同一个,说明此时的关系是冗余关系,cou++。
#include <iostream>
#include <cstdio>

using namespace std;

int s[1005];
int cou=0;

int find_set(int a){
    if(s[a]!=a) s[a]=find_set(s[a]);
    return s[a];
}

void union_set(int a,int b){
    int fa=find_set(a);
    int fb=find_set(b);
    if(fa!=fb){
        s[fa]=fb;
    }else{
        cou++;
    }
}

int main()
{
    int n,m;
    int x,y;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++){
        s[i]=i;
    }
    for(int i=0;i<n;i++){
        scanf("%d %d",&x,&y);
        union_set(x,y);
    }
    printf("%d\n",cou);
    return 0;
}
时间: 2024-11-07 07:38:53

冗余关系_并查集的相关文章

poj 1182 食物链 (带关系的并查集)

  食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44835 Accepted: 13069 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类.

Farm Irrigation_深搜_并查集

Farm Irrigation TimeLimit: 2000/1000 MS (Java/Others)  MemoryLimit: 65536/32768 K (Java/Others) 64-bit integer IO format:%I64d Problem Description Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a lot of

jzoj 2936_逐个击破_并查集

题目描述 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,maozedong制定了先切断敌人东洒两头退路然后再逐个歼灭敌人的战略方针. 秉承伟大军事家的战略思想,作为一个有智慧的军长你,遇到了一个类似的战场局面: 现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的,现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花

连通分量个数(连通分量_并查集)

 连通分量个数Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Description 在无向图中,如果从顶点vi到顶点vj有路径,则称vi和vj连通.如果图中任意两个顶点之间都连通,则称该图为连通图, 否则,称该图为非连通图,则其中的极大连通子图称为连通分量,这里所谓的极大是指子图中包含

[bzoj1455]罗马游戏_左偏树_并查集

罗马游戏 bzoj-1455 题目大意:给你n个人,2种操作,m次操作:1.将i号士兵所在的集合的最小值删除 2.合并i和j两个士兵所在的团体 注释:$1\le n\le 10^6$,$1\le m \le 10^5$. 想法:又是GXZlegend讲课,可并堆中的左偏树.了解一下: 一个具有堆性质的二叉树满足任意一个节点x中,dis[lson[x]]>=dis[rson[x]],其中,dis表示当前节点一直走右儿子的最长步数.合并是递归合并,我们通过递归处理一两个节点为根节点的左偏树的合并,显

BZOJ_2303_[Apio2011]方格染色 _并查集

Description Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好,他们想要表格中每个2 ×   2的方形区 域都包含奇数个(1 个或 3 个)红色方格.例如,右 图是一个合法的表格染色方案(在打印稿中,深色代 表蓝色,浅色代表红色) . 可是昨天晚上,有人已经给表格中的一些方格染上了颜色!现在Sam和Sara 非常生气.不过,他们想要知道是否可能给剩下的方格染上颜色,使得整个表格 仍然满足她们的要求.如果可能的话,满足他们

BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集

Description 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤40000)条的不同的垂直或水 平的道路连结着农场,道路的长度不超过1000.这些农场的分布就像下面的地图一样, 图中农场用F1..F7表示, 每个农场最多能在东西南北四个方向连结4个不同的农场.此外,农场只处在道路的两端.道路不会交叉且每对农场间有且仅有一条路径.邻居鲍伯要约翰来导航,但约翰丢了农场的地图,他只得从电脑的备份中修复了.每一条道路的信息如下: 从农场23往南经距离10到达农场17 从农场1往

[bzoj2443][Usaco2011 Open]奇数度数_树形dp_生成树_并查集

奇数度数 bzoj-2443 Usaco-2011 Open 题目大意:给定一个n个点m条便有向图,问是否有一种选出一些边的方式使得所有点的度数都是奇数. 注释:$1\le n \le 5\cdot 10^4$,$1\le m\le 10^5$. 想法: 结论题:对于一个联通块来讲,如果求出它的生成树.只考虑生成树上的边的选取情况是否可能即是这个联通块的答案. 证明:如果存在一种,选取生成树以外的边满足题意,我们可以将这条边覆盖的树边全部取反,将该边舍去,仍然满足题意. 故此,用并查集求出生成树

【模板】左偏树(可并堆) 可并堆_并查集

左偏树的树高是 $log(n)$ 级别的,所以在查询祖先的时候是不可以直接顺着左偏树上的父亲查询的. 另开一个并查集,在并查集上进行路径压缩的查询即可. Code: #include <cstdio> #include <algorithm> #include <cstring> #define maxn 100006 #define setIO(s) freopen(s".in","r",stdin) using namespa