HDU 6109 数据分割
小w来到百度之星的赛场上,准备开始实现一个程序自动分析系统。
这个程序接受一些形如 xi=xj 或 xi≠xj 的相等/不等约束条件作为输入,判定是否可以通过给每个 w 赋适当的值,来满足这些条件。
输入包含多组数据。
然而粗心的小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,则该约束条件为 xi≠xjxi≠xj 。
i,j,L≤100000i,j,L≤100000
xi,xj≤Lxi,xj≤LOutput输出共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\n",anst); 51 for(int i=1;i<=anst;i++) 52 printf("%d\n",ans[i]-ans[i-1]); 53 return 0; 54 }