小白进阶之路-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; }