• HDU 6109 数据分割


      小w来到百度之星的赛场上,准备开始实现一个程序自动分析系统。 
    这个程序接受一些形如 xi=xj 或 xi≠xj 的相等/不等约束条件作为输入,判定是否可以通过给每个 w 赋适当的值,来满足这些条件。 
    输入包含多组数据。 
    然而粗心的小w不幸地把每组数据之间的分隔符删掉了。 
    他只知道每组数据都是不可满足的,且若把每组数据的最后一个约束条件去掉,则该组数据是可满足的。 
    请帮助他恢复这些分隔符。

    Input第11行:一个数字LL,表示后面输入的总行数。 
    之后LL行,每行包含三个整数,i,j,ei,j,e,描述一个相等/不等的约束条件,若e=1e=1,则该约束条件为xi=xjxi=xj ,若e=0e=0,则该约束条件为 xixjxi≠xj 。 
    i,j,L100000i,j,L≤100000 
    xi,xjLxi,xj≤L
    Output输出共T+1T+1行。 
    第一行一个整数TT,表示数据组数。 

    接下来TT行的第ii行,一个整数,表示第i组数据中的约束条件个数。 
    Sample Input

    6
    2 2 1
    2 2 1
    1 1 1
    3 1 1
    1 3 1
    1 3 0

    Sample Output

    1
    6

    题解:用set维护并查集,如果相等不在一个集合里面,则在集合之间连衣条边;如果在同一集合出现不等的情况,就不对;

    参考代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=1e5+10;
     4 set<int> g[maxn];
     5 int n,m;
     6 int a[maxn],b[maxn],c[maxn],fa[maxn];
     7 int anst,ans[maxn];
     8 int find(int x){return x==fa[x]? x:fa[x]=find(fa[x]);}
     9 void init()
    10 {
    11     for(int i=1;i<maxn;i++)
    12         g[i].clear(),fa[i]=i;
    13 } 
    14 int main()
    15 {
    16     scanf("%d",&n);
    17     for(int i=1;i<=n;i++) scanf("%d%d%d",&a[i],&b[i],&c[i]);
    18     init();
    19     set<int>::iterator it;
    20     for(int i=1;i<=n;i++)
    21     {
    22         int u=find(a[i]);
    23         int v=find(b[i]);
    24         if(c[i])
    25         {
    26             if(u==v) continue;
    27             else if(g[u].find(v)!=g[u].end())
    28             {
    29                 init();
    30                 ans[++anst]=i; 
    31             }
    32             else
    33             {
    34                 for(it=g[v].begin();it!=g[v].end();++it)
    35                 {
    36                     g[u].insert(*it);
    37                     g[*it].erase(v);
    38                     g[*it].insert(u);
    39                 }
    40                 g[v].clear();
    41                 fa[v]=u;
    42             }
    43         }
    44         else
    45         {
    46             if(u!=v){g[u].insert(v);g[v].insert(u);}
    47             else{ans[++anst]=i;init();}
    48         }
    49     }
    50     printf("%d
    ",anst);
    51     for(int i=1;i<=anst;i++)
    52         printf("%d
    ",ans[i]-ans[i-1]);
    53     return 0;
    54 }
    View Code
  • 相关阅读:
    ingress-nginx-controller 504 gateway time-out 问题
    ansible的shell模板使用awk包含引号的问题
    Python selenium模块报错解决
    redis密码破解(multiprocessing的Pool多进程模式)-join方法小坑
    redis密码破解(Python使用multiprocessing分布式进程)
    redis密码破解(python使用redis模块)
    redis密码破解(python使用socket模块)
    修改云主机快照方式为live snapshot
    虚拟机重启错误,libvirtError:internal error:process exited while connecting to monitor
    如何解决高并发秒杀的超卖问题
  • 原文地址:https://www.cnblogs.com/csushl/p/10331426.html
Copyright © 2020-2023  润新知