牛客小白月赛24 H.人人都是好朋友

人人都是好朋友

https://ac.nowcoder.com/acm/contest/5158/H

考点:并查集,离散化。
这题题意很明确,做法也很明确。
先对友好的弄一个并查集,最后再查询敌人是否为友好关系。

#include <bits/stdc++.h>
#include <unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int mod = 10000;
const int N = 5e6 + 10;
int pre[N];
int a[N];
int b[N];
int c[N];
int d[N];
int find(int a)
{
    return pre[a] == a ? a : pre[a] = find(pre[a]);
}
int main()
{
#ifdef LOCAL
    freopen("E:/input.txt", "r", stdin);
#endif
    int t;
    cin >> t;
    while (t--)
    {
        int n, cnt = 0;
        cin >> n;
        int flag = 1;
        for (int i = 1; i <= n; i++)
        {
            scanf("%d%d%d", &a[i], &b[i], &c[i]);
            d[++cnt] = a[i];
            d[++cnt] = b[i];
        }
        sort(d + 1, d + cnt + 1);
        cnt = unique(d + 1, d + cnt + 1) - d;
        for (int i = 1; i <= n; i++)
        {
            a[i] = lower_bound(d + 1, d + cnt + 1, a[i]) - d;
            b[i] = lower_bound(d + 1, d + cnt + 1, b[i]) - d;
        }
        for (int i = 1; i <= cnt; i++)
        {
            pre[i] = i;
        }
        for (int i = 1; i <= n; i++)
        {
            if (c[i] == 1)
            {
                int u = find(a[i]);
                int v = find(b[i]);
                pre[u] = v;
            }
        }
        for (int i = 1; i <= n; i++)
        {
            if (c[i] != 1)
            {
                int u = find(a[i]);
                int v = find(b[i]);
                if (u == v)
                    flag = 0;
            }
        }
        if (flag)
            puts("YES");
        else
            puts("NO");
    }
    return 0;
}
全部评论
敌人关系为什么可以用并查集啊,敌人的敌人也是敌人?
点赞 回复 分享
发布于 2020-04-19 12:18

相关推荐

Java面试先知:我也是和你一样的情况,hr 说等开奖就行了
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务