UVALive 6091 并查集简单应用

点击打开链接

题意:问你给出的图中有多少颗树,树的定义与最小生成树类似,不能有重边或者环

思路:直接用并查集统计一下当前集合里的边的数量以及点的数量,如果点的数量与边的数量相等,那么是一颗树,统计完即可,水题~~~

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3fll;
const int maxn=510;
int f[maxn],num[maxn],r[maxn];
int find1(int x){
    if(x!=f[x]) f[x]=find1(f[x]);
    return f[x];
}
void unite(int a,int b){
    int aa=find1(a);
    int bb=find1(b);
    if(aa==bb){
        num[bb]++;return ;
    }
    f[aa]=bb;num[bb]+=num[aa];r[bb]+=r[aa];
}
int main(){
    int n,m,u,v,cas=1;
    while(scanf("%d%d",&n,&m)!=-1){
        if(n==0&&m==0) break;
        for(int i=0;i<=n;i++){
            f[i]=i;num[i]=1;r[i]=1;
        }
        for(int i=0;i<m;i++){
            scanf("%d%d",&u,&v);
            unite(u,v);
        }
        int sum=0;
        for(int i=1;i<=n;i++){
            if(find1(i)==i){
                if(r[i]==num[i]) sum++;
            }
        }
        if(sum==0) printf("Case %d: No trees.\n",cas++);
        else if(sum==1) printf("Case %d: There is one tree.\n",cas++);
        else printf("Case %d: A forest of %d trees.\n",cas++,sum);
    }
    return 0;
}
时间: 2024-09-27 04:43:17

UVALive 6091 并查集简单应用的相关文章

RQNOJ36 数石子 并查集 简单应用

题目描述 佳佳是个贪玩的孩子.一天,他正在跟凡凡玩“数石子”的游戏.佳佳在地上摆了N堆石子,其中第I堆石子有Ai个石头.佳佳每次都会问凡凡:“凡凡,请问从第I堆到第J堆,总共有多少个石子?”聪明的凡凡每次都能快速而准确地回答对.凡凡老是被问问题,心里有些不服,就对佳佳说:“佳佳,你还记得你问了什么问题,我回答了什么答案吗?”佳佳说当然记得.于是凡凡说:“好,我把石子拿走,再问你一些相似的问题,你能答得出来吗?”佳佳张圆了嘴巴,望着凡凡,一脸疑问和惊讶的表情.你现在知道了游戏规则和过程,但没看见原

poj2236 Wireless Network 并查集简单应用

Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network with the lap computers, but an unexpected aftershock attacked, all computers in the network were all broken. The computers

poj1611(并查集简单应用)

题目链接:http://poj.org/problem?id=1611 思路: 显然是一个并查集的题,很简单,只要将一个group中的学生并在一起,最后遍历1到n-1,看有多少学生的祖先与0的祖先相等即可. 代码如下: 1 #include<cstdio> 2 using namespace std; 3 4 int n,m,res,root[30005]; 5 6 int getr(int k){ 7 if(root[k]==k) return k; 8 else return root[k

并查集简单题

The Suspects 题目传送:POJ-1611-The Suspects AC代码: #include <map> #include <set> #include <cmath> #include <deque> #include <queue> #include <stack> #include <cstdio> #include <cctype> #include <string> #in

无间道之并查集 (hihocoder第十四周i)

时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 这天天气晴朗.阳光明媚.鸟语花香,空气中弥漫着春天的气息……额,说远了,总之,小Hi和小Ho决定趁着这朗朗春光出去玩. 但是刚刚离开居住的宾馆不久,抄近道不小心走入了一条偏僻小道的小Hi和小Ho就发现自己的前方走来了几个彪形大汉,定睛一看还都是地地道道的黑人兄弟!小Hi和小Ho这下就慌了神,捡肥皂事小,这一身百把来斤别一不小心葬身他乡可就没处说去了. 就在两人正举足无措之时,为首的黑叔叔从怀里掏出了一件东西——两张花花

POJ2236 Wireless Network 【并查集】

Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 16885   Accepted: 7091 Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network with the lap computer

hdu 4750 Count The Pairs(并查集+二分)

Problem Description With the 60th anniversary celebration of Nanjing University of Science and Technology coming soon, the university sets n tourist spots to welcome guests. Of course, Redwood forests in our university and its Orychophragmus violaceu

程序自动分析(并查集+排序)

题意 给许多个x,y,k,若k=1,x==y,否则x!=y,如果矛盾,输出NO,否则YES 对于k=1,并查集简单操作一下,k=0,如果find(x)==find(y),打个标记,输出NO: 有一个需要注意的地方是,对于询问我们要进行sort,使k=1的情况先执行,这样可以保证最后判断的答案正确. #include<iostream> #include<cstdio> using namespace std; int re(){ char c=getchar();int all=0

关于最小生成树(并查集)prime和kruskal

适合对并查集有一定理解的人.  新手可能看不懂吧.... 并查集简单点说就是将相关的2个数字联系起来 比如 房子                      1   2    3   4  5   6 能通向的房子        2   3    4  5  6    1 主要 建立并查集的 函数结构 模板(一般不变除非加权--最好能理解) for(int i=0;i<n;i++)         flag[i]=i;               //标记数组初始化以方便寻根 1 int find