HDU 6109 数据分割

Posted songorz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于HDU 6109 数据分割的主要内容,如果未能解决你的问题,请参考以下文章

HDU 6109 数据分割 并查集 (2017"百度之星"程序设计大赛 - 初赛(A))

hdu6109(并查集+set/倍增)

通过 BPM 将音轨分割成片段,并使用 Superpowered iOS 分析每个片段

如何从 RCNN 中裁剪分割的对象?

SYN6109型 NTP网络子钟

JavaScript 片段