小白进阶之路-HYSBZ - 4195

题目:不过原OJ网站不使用了

 

思路:每个实例数据量为 1e6 ,这个是突破口,题目本身的思考方向就是并查集,e = 1的数据 a,b 放在同一个集合下,暂时保存e = 0的数据,输入完后以此查询可能性。但数据范围到1e9。需要用map进行hash,使得所有数据范围都在1e6内。

 

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<stack>
#include<queue>
#include<map> 
#include<list>
#include<string>
#include<cstring>
#include<set>
#include<vector>
#define ll long long
#define memset(a,n) memset(a,n,sizeof(a))
#define mp make_pair 
#define pb push_back
using namespace std;
const int maxn = 1e6 + 100;


int p[maxn];
map<int,int> M;
int id ;

struct node{
    int a,b,e;
};

int Getid(int x) // 用来Hash数据
{
    return M[x] ? M[x] : M[x] = ++id;
}

int Find(int x) // 并查集查找
{
    return p[x] == x ? x : p[x] = Find(p[x]);
}

void solve()
{
    int n;scanf("%d",&n);
    vector<node> P;M.clear();id = 0;
    for(int i = 0 ;i <= maxn;i++) p[i] = i;
    for(int i = 0 ;i < n;i++){
        int a,b,e;scanf("%d%d%d",&a,&b,&e);
        if(e == 1){
            int fa = Find(Getid(a));
            int fb = Find(Getid(b));
            if(fa != fb){
                p[fa] = fb;
            }
        }else {
            struct node cur ;
            cur.a = a;cur.b = b;cur.e = e;
            P.push_back(cur);
        }
    }
    for(int i = 0 ; i < P.size();i++){
        struct node cur = P[i];
        int a = cur.a,b = cur.b;
        int fa = Find(Getid(a));
        int fb = Find(Getid(b));
        if(fa == fb){ // 如果a,b之间已经在一个集合内,代表不可能不相等
            printf("NO\n");return ;
        }
    }
    printf("YES\n");return ;
}


int main()
{
    int t;scanf("%d",&t);
    while(t--){
        solve();
    } 
    return 0;
}

 

posted @ 2020-05-04 19:14  Wise_4  阅读(114)  评论(0编辑  收藏  举报