首页 > 其他 > 详细

BZOJ 4195 程序自动分析

时间:2016-04-30 18:12:04      阅读:257      评论:0      收藏:0      [点我收藏+]

一开始我写的一边合并一边判,然后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\n");
    else printf("YES\n");
}
int main()
{
    scanf("%d",&t);
    for (int i=1;i<=t;i++)
        work();
    return 0;
}

 

BZOJ 4195 程序自动分析

原文:http://www.cnblogs.com/ziliuziliu/p/5449042.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!