Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
为何一直RE 求大侠指点 (并查集+离散)#include <stdio.h> #include <string.h> const int maxn=1000100; const int mod=999997; int set[maxn],val[maxn],rank[maxn]; int head[mod],top,index; struct nodes { int num,next,id; }node[maxn]; int find(int a) { int pa=set[a]; if(set[a]==a) return a; set[a]=find(set[a]); val[a]=val[pa]^val[a]; return set[a]; } void Union(int a,int b,int v) { int fa,fb; fa=find(a); fb=find(b); if(fa==fb) return; if(rank[fa]>=rank[fb]) { if(rank[fa]==rank[fb]) rank[fa]++; set[fb]=set[fa]; val[fb]=(val[a]+val[b]+v)%2; }else{ set[fa]=set[fb]; val[fa]=val[a]^val[b]^v; } } void init() { for(int i=0;i<maxn;i++) { set[i]=i; rank[i]=0; val[i]=0; head[i]=0; } top=1; index=1; } int getid(int a) { return a; int i,key=a%mod; for(i=head[key];i;i=node[i].next) { if(node[i].num==a) return node[i].id; } node[++top].next=head[key]; node[top].id=++index; node[top].num=a; head[key]=top; return index; } int main() { int a,b,i,t=0,ha,hb,v,n,flag=0; char op[10]; freopen("d:\\1.txt","r",stdin); init(); scanf("%d%d",&a,&n); for(i=0;i<n;i++) { scanf("%d%d%s",&a,&b,op); //if(flag) continue; if(op[0]=='o') v=1; else v=0; ha=getid(a-1); hb=getid(b); //if(top>maxn) while(1); if(find(ha)!=find(hb)){ Union(ha,hb,v); } else if((val[ha]^val[hb])!=v) break; t++; } printf("%d\n",t); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator