51nod 1515 明辨是非 [并查集+set]

今天cb巨巨突然拿题来问,感觉惊讶又开心,希望他早日康复!!坚持学acm!加油!

 

题目链接:51nod 1515 明辨是非 [并查集]

1515 明辨是非

题目来源: 原创

基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题

给n组操作,每组操作形式为x y p。

当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等;否则输出NO,并忽略此次操作。

当p为0时,如果第x变量和第y个变量可以不相等,则输出YES,并限制他们不相等 ;否则输出NO,并忽略此次操作。

Input

输入一个数n表示操作的次数(n<=1*10^5) 接下来n行每行三个数x,y,p(x,y<=1*10^8,p=0 or 1)

Output

对于n行操作,分别输出n行YES或者NO

Input示例

3 1 2 1 1 3 1 2 3 0

Output示例

YES YES NO

 

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <limits.h>
#define CLR(a,b) memset((a),(b),sizeof((a)))
using namespace std;
typedef long long ll;
const int N = 1e5+5;
int fa[N], r[N];

map <int, int> vis;
set <int> s[N];
set <int> :: iterator it;
struct node{
    int x, y, p;
}q[N];
int fin(int x) {
    if(x != fa[x]) fa[x] = fin(fa[x]);
    return fa[x];
}
void uni(int a, int b) {
    if(r[a] > r[b]) {
        for(it = s[b].begin(); it != s[b].end(); it++) {
           // s[a].insert(*it);
            int x = fin(*it);
            s[*it].erase(b);
            s[a].insert(x);
            s[x].insert(a);
        }
        fa[b] = a;
        r[a]++; 
    }
    else {
        for(it = s[a].begin(); it != s[a].end(); it++)  {
            //s[b].insert(*it);
            int x = fin(*it);
            s[*it].erase(a);
            s[b].insert(x);
            s[x].insert(b);
        }
        fa[a] = b;
        r[b]++;
    }
}
int main() {
    int n, x, y, t = 1;
    scanf("%d", &n);

    for (int i = 1; i <= n; ++i) {
        scanf("%d%d%d", &x, &y, &q[i].p);
        if(!vis[x]) {vis[x] = t; q[i].x = t++;}
        else q[i].x = vis[x];

        if(!vis[y]) {vis[y] = t; q[i].y = t++;}
        else q[i].y = vis[y];
    }
    for(int i = 1; i <= n; ++i) {
        fa[q[i].x] = q[i].x;
        fa[q[i].y] = q[i].y;
    }
    for(int i = 1; i <= n; ++i) {
        t = 0;
        x = fin(q[i].x);
        y = fin(q[i].y);
        if(q[i].p) {
            if(x == y) puts("YES");
            else {
                /*for(it = s[x].begin(); it != s[x].end(); it++) {
                    if(s[y].count(*it)) {
                        t = 1;
                        break;
                    }
                }
                for(it = s[y].begin(); it != s[y].end(); it++) {
                    if(s[x].count(*it)) {
                        t = 1; 
                        break;
                    }
                }
                if(t) puts("NO");*/
                if(s[x].count(y) || s[y].count(x)) puts("NO");
                else {
                    puts("YES");
                    uni(x, y);
                }
            }
        }
        else {
            if(x == y) puts("NO");
            else {
                puts("YES");
                s[x].insert(y);
                s[y].insert(x);
            }
        }
    }
    return 0;
}
posted @ 2017-05-11 00:33  GraceSkyer  阅读(323)  评论(0编辑  收藏  举报

~~~~~~ACM大牛语录,激励一下~~~~~~

为了世界的和平,为了女生的安全,我拼命做题,做题,做题!

用最短的时间,刷最多的题!

给我一滴泪,我就看到了你全部的海洋!

seize the hour, seize the day.

人生难免有无奈,幸福走远了,或是感叹幸福来迟了.其实我一直相信,无论手中的幸福是多么微不足道的感觉,我会把握住那每一分,每一秒,当幸福依旧像那百鸟般飞逝,终究无法掌握时,我会感谢它,曾经降临过!

A自己的题,让别人郁闷去吧

WA肠中过,AC心中留 TLE耳边过,AC特别牛

天然的悲苦和伤逝,过去有过,以后还会有

^*^一步一步往上爬^*^

AC就像练级,比赛就像PK. 练级不如PK好玩

其实,世上本没有ACM,AC的人多了,也便有了!

AC无止尽~ Seek you forever~

找呀找呀找水题,找到一个AC一个呀!

AC是检验程序的唯一标准。

真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血……