程序自动分析

题目链接

题意:给你n对x,y,你知道xy是否相等,问能否构成合法序列。n<=1e6,x,y<=1e9.

思路:很明显是一个并查集的题目,当xy相等时为一个集合。需要注意的是因为xy很大所以要离散化,

我用的是map离散化,刚开始用迭代器t了!!!

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<cmath>
#define ll long long
using namespace std;
map<int,int> mp;
struct point 
{
    int x;
    int y;
    int z;
}a[1000010];
int fa[2000010];

int get(int k)
{ 
    return fa[k]==k?k:fa[k]=get(fa[k]); 
}
void merge(int x,int y)
{
    fa[get(x)]=get(y); 
}
bool cmp(point a,point b)
{
    return a.z>b.z;
}
int main()
{
    int t;
    while(~scanf("%d",&t))
    {
        while(t--)
        {
            int n;
            mp.clear();
            scanf("%d",&n);
            int m=1;
            for(int i=0;i<n;i++)
            {
                scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
                if(mp[a[i].x]==0)
                {
                    mp[a[i].x]=m;
                    a[i].x=m;
                    m++;
                }
                else
                {
                    a[i].x=mp[a[i].x];
                }
                if(mp[a[i].y]==0)
                {
                    mp[a[i].y]=m;
                    a[i].y=m;
                    m++;
                }
                else
                {
                    a[i].y=mp[a[i].y];
                }
            //    printf("x:%d y:%d\n",a[i].x,a[i].y);
            }
        /*    int m=1;
            for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++)
            {
                mp[it->first]=m;
                m++;
            }*/
            for(int i=1;i<=m;i++)
            {
                fa[i]=i;
            }
            int flag=0;
            sort(a,a+n,cmp);
            for(int i=0;i<n;i++)
            {
                int u=get(a[i].x);
                int v=get(a[i].y);
            //    printf("x:%d fa:%d\n",a[i].x,u);
            //    printf("y:%d fa:%d\n",a[i].y,v);
                if(a[i].z==1)
                {
                    merge(u,v);
                }
                else
                {
                    if(u==v)
                    {
                        flag=1;
                        break;
                    }
                }
            }
            if(flag)
            printf("NO\n");
            else
            printf("YES\n");
        }
        
    }
}

 

posted @ 2019-08-12 10:09  Ldler  Views(210)  Comments(0Edit  收藏  举报