Timus 1003 并查集
并查集 讲解看如下博客:
http://start07.yo2.cn/articles/ural-1003-parity.html
#include<iostream> #include<cstring> #include<cstdio> using namespace std; #define BLOCK 10000 int HashTable[20000],father[20000],Rank[20000],N; int Hash(int a) { int i; for(i=1;i<N;i++) if(HashTable[i]==a) return i; HashTable[N]=a; return N++; } int find(int x) { while(x!=father[x]) x=father[x]; return x; } int Union(int a,int b) { int x,y; x=find(a); y=find(b); if(Rank[x]>Rank[y]) { father[y]=x; Rank[x]+=Rank[y]; } else { father[x]=y; Rank[y]+=Rank[x]; } return 0; } int main() { int i,m,n,s,t; char mark[20]; while(scanf("%d",&n) && n!=-1) { N=1; for(i=1;i<20000;i++) { father[i]=i; Rank[i]=1; } scanf("%d",&m); for(i=1;i<=m;i++) { scanf("%d %d %s",&s,&t,mark); s=Hash(s-1); t=Hash(t); if(strcmp(mark,"even")==0) { if(find(s)==find(t+BLOCK)) break; Union(s,t); Union(s+BLOCK,t+BLOCK); } else { if(find(s)==find(t)) break; Union(s,t+BLOCK); Union(t,s+BLOCK); } } printf("%d\n",i-1); for(i++;i<=m;i++) scanf("%d %d %s",&s,&t,mark); } return 0; }