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

    一开始我写的一边合并一边判,然后WA了。

    然后我想了很久。

    为什么不先做完相等的再判断不等的?

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 2000500
    using namespace std;
    int t,n,father[maxn],stack[maxn],tot=0;
    int a[maxn],b[maxn],c[maxn];
    int cnt;
    int hash(int x)
    {
        return lower_bound(stack+1,stack+cnt+1,x)-stack;
    }
    int getfather(int x)
    {
        if (x!=father[x])
            father[x]=getfather(father[x]);
        return father[x];
    }
    void unionn(int a,int b)
    {
        int f1=getfather(a),f2=getfather(b);
        if (f1!=f2) father[f1]=f2;
    }
    bool judge(int a,int b)
    {
        int f1=getfather(a),f2=getfather(b);
        if (f1!=f2) return true;
        return false;
    }
    void work()
    {
        int flag=1;tot=0;
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
        {
            scanf("%d%d%d",&a[i],&b[i],&c[i]);
            stack[++tot]=a[i];stack[++tot]=b[i];
        }
        sort(stack+1,stack+tot+1);
        cnt=unique(stack+1,stack+tot+1)-stack-1;
        for (int i=1;i<=cnt;i++) father[i]=i;
        for (int i=1;i<=n;i++)
        {
            if (c[i]==1) 
                unionn(hash(a[i]),hash(b[i]));
        }
        for (int i=1;i<=n;i++)
        {
            if (c[i]==0)
            {
                if (judge(hash(a[i]),hash(b[i]))==false) 
                    flag=0;
            }
        }
        if (flag==0) printf("NO
    ");
        else printf("YES
    ");
    }
    int main()
    {
        scanf("%d",&t);
        for (int i=1;i<=t;i++)
            work();
        return 0;
    }
  • 相关阅读:
    DVWA系列のSQL注射
    DVWA系列のCSRF&文件包含
    PHPSTORM+Xdebug配置
    Django 从入门到忘记学习笔记
    <双十一特辑> 模拟登录学校教务处爬取全校女生资料和头像
    zzcms7.2漏洞挖掘学习
    laravel5.3搭建过程中出现问题
    kali-linux简单学习
    linux学习二(小随笔)
    linux学习一
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5449042.html
Copyright © 2011-2022 走看看