bzoj2079 [Poi2010]Guilds 并查集+乱搞

38 篇文章 0 订阅
29 篇文章 0 订阅

Description


Zy皇帝面临一个严峻的问题,两个互相抵触的贸易团体,YYD工会和FSR工会,他们在同一时间请求在王国各个城市开办自己的办事处。这里有n个城市,其中有一些以双向马路相连,这两个工会要求每个城市应该做到: 1:有这个工会的办事处或 2:和另外一个符合1条件的城市有马路直接相连。(也就是每个城市必须是YYD的公会,但是又和FSR的公会的城市相连,或者是FSR的,和YYD的城市相连,或者和两个工会的城市相连)但是Zy怀疑不正当的竞争,他担心一个城市有两个工会的办事处,(就是说一个城市不能有两个工会的办事处)只将导致贸易的垄断(政治怎么学的),所以他请求他日夜栽培的你给予帮助。
n(1<=n<=200000)
m(1<=m<=500000)

Solution


容易想到一棵树的情况是一定可以的,那么我们在这棵树上加返祖边也不影响性质。即如果没有一个size为1的连通块就一定可行

Code


#include <stdio.h>
#include <string.h>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
const int N=200005;
int size[N],fa[N];
int get_father(int now) {return (!fa[now])?(now):(fa[now]=get_father(fa[now]));}
void merge(int x,int y) {
    x=get_father(x); y=get_father(y);
    if (x==y) return ;
    fa[x]=y;
}
int main(void) {
    int n,m; scanf("%d%d",&n,&m);
    rep(i,1,m) {
        int x,y;
        scanf("%d%d",&x,&y);
        merge(x,y);
    }
    rep(i,1,n) size[get_father(i)]++;
    rep(i,1,n) if (size[i]==1) {
        puts("NIE");
        return 0;
    }
    puts("TAK");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值