题解 | 人人都是好朋友

人人都是好朋友

https://www.nowcoder.com/practice/431a2726d73e424896d3fd222c2c1621

由于节点数量太多,所以考虑使用哈希表优化的并查集,另外合并不使用递归防止深度过大发生段错误;

由于朋友之间具有传递性,所以可以把所有的朋友看作是一个集合,从这里可以想到使用并查集

#include <bits/stdc++.h>
#define int long long
using namespace std;
#define endl '\n'
#define pb push_back
#define ull unsigned long long
#define all(a) a.begin(), a.end()
#define vi vector<int>
#define vii vector<vector<int>>
#define fi first 
#define se second
#define eb emplace_back
#define in insert
#define pf push_front
const int inf = 2e18 + 9 ;
const int mod1 = 1e9 + 7 ; 
const int mod2 = 998244353 ; 
typedef pair<int, int> pll;
typedef long double db;

inline int gcd(int a , int b) {return b ? gcd(b , a % b) : a;};
template<class T>inline void read(T &res){char c;T flag=1;while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;}
inline int qsm(int a , int b){int res = 1 ; while(b){if(b & 1){res *= a ; }b >>= 1 ; a *= a ; }return res ; }
struct dsu
{
     unordered_map<int, int> pa;
    unordered_map<int, int> rank;
    int find(int x)
    {
        if (!pa.count(x)) 
        {
            pa[x] = x;
            rank[x] = 1;
        }
        while(pa[x] != x)
        {
            pa[x] = pa[pa[x]]; 
            x = pa[x];
        }
        return pa[x] ; 
    }
    void unite(int x , int y)
    {
        x = find(x) ; 
        y = find(y) ; 
        if(x == y)
        {
            return ; 
        }
        if(rank[x] > rank[y])
        {
            swap(x , y);
        }
        pa[x] = y ; 
        if(rank[x] == rank[y])
        {
            rank[y]++ ; 
        }
    }
};
void work() 
{
    int n ; cin >> n ; 
    dsu hao;
    vector<pll>a ; 
    for(int i = 1 ; i <= n ; i++)
    {
        int x , y , z ; cin >> x >> y >> z ;
        if(z != 1)
        {
            a.pb({x , y});
        }
        else 
        {
            hao.unite(x , y);
        }
    }
    for(size_t i = 0 ; i < a.size() ; i++)
    {
        auto [a1 , a2] = a[i];
        if(hao.find(a1) == hao.find(a2))
        {
            cout << "NO" << endl ; 
            return ; 
        }
    }
    cout << "YES" << endl ; 
}
signed main() 
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    cin >> t ; 
    while (t--) 
    {
        work();
    }
    return 0;
}

全部评论

相关推荐

牛客78682892...:直接点还好,总比要了简历也不回的强
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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