• NOIP 考前 并查集复习


    POJ 1182

    把一个点拆成x,x+n,x+2*n,x吃y可以表示认为x,y+n是一类的,x+n,y+2*n是一类,x+2*n,y是一类。

     1 #include <cstdio>
     2 
     3 const int Maxn=50100;
     4 int F[Maxn*3],n,k,Type,x,y,Ans;
     5 int Get(int x) {return F[x]==x?x:F[x]=Get(F[x]);}
     6 int main()
     7 {
     8     scanf("%d%d",&n,&k);
     9     for (int i=1;i<=3*n;i++) F[i]=i;
    10     for (int i=1;i<=k;i++)
    11     {
    12         scanf("%d%d%d",&Type,&x,&y);
    13         if (x>n || y>n || (x==y && Type==2))
    14         {
    15             Ans++;
    16             continue;
    17         }
    18         
    19         if (Type==1)
    20         {
    21             if (Get(x)==Get(y+n) || Get(x)==Get(y+2*n))
    22             {
    23                 Ans++;
    24                 continue;
    25             }
    26             F[Get(x)]=Get(y);
    27             F[Get(x+n)]=Get(y+n);
    28             F[Get(x+2*n)]=Get(y+2*n);
    29         } else 
    30         {
    31             if (Get(x)==Get(y) || Get(x)==Get(y+2*n))
    32             {
    33                 Ans++;
    34                 continue;
    35             }
    36             F[Get(x)]=Get(y+n);
    37             F[Get(x+n)]=Get(y+2*n);
    38             F[Get(x+2*n)]=Get(y);
    39         }
    40     }
    41     printf("%d
    ",Ans);
    42     return 0;
    43 }
    POJ 1182

    HDU 3047

    Sum[x]表示fa[x]和x的差. 带权并查集

    #include <cstdio>
    
    int Sum[50010],Father[50010],n,m,Count,u,v,w;
    int Get_Father(int x)
    {
        if (x==Father[x]) return x;
        int Tmp=Get_Father(Father[x]);
        Sum[x]+=Sum[Father[x]];
        return Father[x]=Tmp;
    }
    int main()
    {
        while (scanf("%d%d",&n,&m)!=EOF)
        {
            for (int i=0;i<=n;i++) Father[i]=i,Sum[i]=0;
            Count=0;
            for (int i=1;i<=m;i++)
            {
                scanf("%d%d%d",&u,&v,&w);
                int fu=Get_Father(u),fv=Get_Father(v);
                if (fu!=fv) 
                {
                    Father[fu]=fv;
                    Sum[fu]=Sum[v]+w-Sum[u];
                } else 
                {
                    if (Sum[u]-Sum[v]!=w)
                        Count++;
                }
            }
            printf("%d
    ",Count);
        }
        return 0;
    }
    HDU 3047

    BZOJ 1202

    带权并查集

     1 #include <cstdio>
     2 int KASE,n,m,u,v,w;
     3 int Father[20010],Sum[20010]; 
     4 int Get_Father(int x)
     5 {
     6     if (x==Father[x]) return x;
     7     int Tmp=Get_Father(Father[x]);
     8     Sum[x]+=Sum[Father[x]];
     9     Father[x]=Tmp;
    10     return Tmp;
    11 }
    12 int main()
    13 {
    14     scanf("%d",&KASE);
    15     for (int Kase=1;Kase<=KASE;Kase++)
    16     {
    17         scanf("%d%d",&n,&m); bool flag=false;
    18         for (int i=0;i<=n;i++) Father[i]=i,Sum[i]=0;
    19         for (int i=1;i<=m;i++)
    20         {
    21             scanf("%d%d%d",&u,&v,&w);
    22             int fu=Get_Father(u-1),fv=Get_Father(v);
    23             if (fu==fv)
    24             {
    25                 if (Sum[u-1]-Sum[v]!=w) 
    26                 {
    27                     flag=true;
    28                     break;
    29                 }
    30             } else
    31             {
    32                 Father[fu]=fv;
    33                 Sum[fu]=Sum[v]-Sum[u-1]+w;
    34             }
    35         }
    36         puts(flag?"false":"true");
    37     }
    38     return 0;
    39 }
    BZOJ 1202
  • 相关阅读:
    利用集群因子优化
    HighCharts之2D对数饼图
    HighCharts之2D回归直线的散点
    HighCharts之2D柱状图、折线图的组合多轴图
    Oracle Data Guard_ 主库添加或删除在线重做日志文件
    Oracle Data Guard_ 主库重命名数据文件
    Oracle Data Guard_ 主备库传输表空间
    打开页面报错
    HighCharts之2D柱状图、折线图的组合双轴图
    HighCharts之2D柱状图、折线图和饼图的组合图
  • 原文地址:https://www.cnblogs.com/yyjxx2010xyu/p/6007570.html
Copyright © 2020-2023  润新知