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 |
用并查集的,本机测试都没问题,不知为何一直WA。Anybody help me?#include "cstdio" #include "memory.h" const int MAXN = 100010; //set记录其代表元素,rank代表集合中的层数; int set[MAXN],rank[MAXN]; int w[MAXN] = {0}; //每个人与其父亲的权值 int adjust; //返回一个包含X的子集。 int FindSet(int x,int& sum) { if(set[x]!=x) { sum += w[x]; set[x] = FindSet(set[x],sum); } return set[x]; } //生成一个单元素集合{X}。这个操作对集合S的每一个元素只能应用一次。 void MakeSet(int x) { set[x]=x; rank[x]=0; } // void Link(int a,int b) { if(rank[a]>rank[b]) { set[b]=a; w[b] = adjust; } else if(rank[a]<rank[b]) { set[a]=b; w[a] = adjust; } else { set[a]=b; rank[b]++; w[a] = adjust; } } //构造分别包含X和Y的不相交子集的并集,并把它添加到子集的集合中,以代替被删除的两个子集; void Union(int a,int b) { int p = 0,q = 0; Link(FindSet(a,p),FindSet(b,q)); } int main() { freopen("s.txt","r",stdin); int t; int n,m; char c; int x,y; int i,j; int p,q; scanf("%d",&t); while (t--) { scanf("%d%d",&n,&m); for (i=1; i<=n; i++) MakeSet(i); memset(w,0,sizeof(int)*(n+1)); while (m--) { while (1) { scanf("%c",&c); if (c == 'A' || c == 'D') break; } scanf("%d%d",&x,&y); if (c == 'A') //ask { p = q = 0; i = FindSet(x,p); j = FindSet(y,q); if (i != j) printf("Not sure yet.\n"); else if ((p+q) % 2 == 0) printf("In the same gang.\n"); else printf("In different gangs.\n"); } else //different { p = q = 0; i = FindSet(x,p); j = FindSet(y,q); if (i != j) { if ((p+q) % 2 == 0) adjust = 1; else adjust = 0; Union(i,j); } } } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator