zoukankan      html  css  js  c++  java
  • 程序自动分析

    题目链接

    题意:给你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
    ",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
    ",a[i].x,u);
                //    printf("y:%d fa:%d
    ",a[i].y,v);
                    if(a[i].z==1)
                    {
                        merge(u,v);
                    }
                    else
                    {
                        if(u==v)
                        {
                            flag=1;
                            break;
                        }
                    }
                }
                if(flag)
                printf("NO
    ");
                else
                printf("YES
    ");
            }
            
        }
    }
  • 相关阅读:
    微信分享 apicloud方式 中遇到的坎
    css之颜色篇
    css总结
    记一些茅塞顿开的事情
    apicloud
    安装MySQL
    智能家居
    java
    数据库设计好不好,分配很重要。
    WP8.1的shell:SystemTray去哪了?
  • 原文地址:https://www.cnblogs.com/2462478392Lee/p/11338117.html
Copyright © 2011-2022 走看看