AcWing 237. 程序自动分析

题目链接:点击这里

在这里插入图片描述
在这里插入图片描述

题目中数据范围 1 i , j 1000000000 1≤i,j≤1000000000 ,但 1 n 1000000 1≤n≤1000000 ,所以实际用到的数据只有 2 1 0 6 2*10^6 ,首先将下标离散化,方便后面的并查集操作。

所有约束条件的顺序对结果是否矛盾无影响,因此,可先考虑所有相等的约束条件,再考虑不等的约束条件。前者不会产生矛盾,后者 x i x j x_i \neq x_j x i x_i x j x_j 已在同一集合中时,就会产生矛盾。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<unordered_map>

using namespace std;
const int N = 2000010;

unordered_map<int,int> mp;
int f[N];
int n;

struct node {
    int x, y, e;
}q[N];

int get(int x)          // 离散化
{
    if(mp.count(x) == 0)    mp[x] = ++n;
    return mp[x];
}

int find(int x)
{
    if(f[x] != x)   f[x] = find(f[x]);
    return f[x];
}

int main()
{
    int T;
    scanf("%d", &T);
    
    while(T--)
    {
        n = 0;
        mp.clear();
        
        int m;
        scanf("%d", &m);
        
        for(int i = 1; i <= m; ++i)
        {
            int x, y, e;
            scanf("%d%d%d", &x, &y, &e);
            q[i] = {get(x), get(y), e};
        }
        
        for(int i = 1; i <= n; ++i) f[i] = i;
        
         // 合并所有相等约束条件
        for(int i = 1; i <= m; ++i)
        {
            if(q[i].e == 1)
            {
                int fx = find(q[i].x), fy = find(q[i].y);
                f[fx] = fy;
            }
        }
        
         // 检查所有不等条件
        bool has_conflict = false;
        for(int i = 1; i <= m; ++i)
        {
            if(q[i].e == 0)
            {
                int fx = find(q[i].x), fy = find(q[i].y);
                if(fx == fy)
                {
                    has_conflict = true;
                    break;
                }
            }
        }
        
        if(has_conflict)    puts("NO");
        else    puts("YES");
    }
    
    return 0;
}
发布了844 篇原创文章 · 获赞 135 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/105148794