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;
}
原文地址:https://www.cnblogs.com/ziliuziliu/p/5449042.html