zoukankan      html  css  js  c++  java
  • AcWing 237 并查集+离散化

    https://www.acwing.com/problem/content/239/
    并查集思路很平常,本题的坑点是数据范围很大,要先进行离散化。其中对于本题在离散化时不用保存原序列的大小,只需要保持一一对应即可,故用unordered_map进行离散化。

    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <unordered_map>
    using namespace std;
    const int N=2000010;
    int n,m;
    int p[N];
    unordered_map<int,int> S;
    struct Query
    {
    	int x,y,e;
    }query[N];
    int get(int x)
    {
    	if(S.count(x)==0) S[x]=++n;
    	return S[x];
    }
    int find(int x)
    {
    	if(p[x]!=x) p[x]=find(p[x]);
    	return p[x];
    }
    void merge(int x,int y)
    {
    	p[find(x)]=find(y);
    }
    int main()
    {
    	int T;
    	scanf("%d",&T);
    	while(T--)
    	{
    		n=0;
    		S.clear();
    		scanf("%d",&m);
    		for(int i=1;i<=m;i++)
    		{
    			int x,y,e;
    			scanf("%d%d%d",&x,&y,&e);
    			query[i]={get(x),get(y),e};
    		}
    		
    		for(int i=1;i<=n;i++) p[i]=i;
    		
    		for(int i=1;i<=m;i++)//合并所有相等条件 
    			if(query[i].e==1)
    			merge(query[i].x,query[i].y);
    			
    		int flag=1;
    		for(int i=1;i<=m;i++)
    		{
    			if(query[i].e==0)
    			{			
    				if(find(query[i].x)==find(query[i].y))
    				{
    					flag=0;
    					break;
    				}
    			}
    		}
    		if(flag) printf("YES
    ");
    		else printf("NO
    ");
    	}
    }```
  • 相关阅读:
    [#]
    Windows 下配置 ApacheBench (AB) 压力测试
    [转载]
    Nginx 系列教程
    设置外接显示器顺序(哪个在左,哪个在右)的方法
    [.Net] 一句话Linq(递归查询)
    [Xamarin]
    [SVN]
    [SQL SERVER]
    [Oracle]
  • 原文地址:https://www.cnblogs.com/daoyuan/p/13462730.html
Copyright © 2011-2022 走看看