Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

R大侠帮忙看看下面的程序为啥wa呢?就是并查集而已呀。

Posted by yangguo981 at 2006-10-14 00:37:50 on Problem 1703
In Reply To:求测试数据或ac的程序,站内~~thanks Posted by:yangguo981 at 2006-10-13 20:32:13
Source

Problem Id:1703  User Id:yangguo981 
Memory:484K  Time:609MS
Language:C++  Result:Wrong Answer

Source 

#include <numeric>
#include <vector>
#include <deque>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <stack>
#include <algorithm>
#include <functional>
#include <iterator>
#include <cmath>
#include <iostream>
#include <sstream>
#include <fstream>
#include <list>
#include <bitset>
using namespace std;

typedef pair<int, int> PII;

#define BE(a) (a).begin(),(a).end()
#define FOR(i,j,k) for((i)=(j); (i)<(k); ++(i))
#define REP(i,n) FOR((i), 0, (n))
#define LENGTH(x) (sizeof((x))/sizeof(((x)[0])))

int T,N,M;
int parent[1000001];
//vector<int> parent;
PII getRoot(int x){
	int level = 0;
	while(parent[x] >= 0)
		x = parent[x],
		++level;
	return PII(x, level);
}
void merge(int x, int y){
	int r1 = getRoot(x).first;
	int r2 = getRoot(y).first;	
	if (r1 == r2) return;
	int level1 = getRoot(x).second;
	int level2 = getRoot(y).second;
	int count1 = parent[r1];
	int count2 = parent[r2];
	//x->y
	if (level1 > level2){
		int current = x,
		next = parent[current];
		while(next >= 0){
			int temp = parent[next];
			parent[next] = current;
			current = next;
			next = temp;
		}
		//parent[next] = current;
		parent[r2] += count1;
		parent[x] = y;
	}
	//y->x
	else{
		int current = y,
		next = parent[current];
		while(next >= 0){
			int temp = parent[next];
			parent[next] = current;
			current = next;
			next = temp;
		}
		//parent[next] = current;
		parent[r1] += count2;
		parent[y] = x;
	}
}
int main(){
	//ifstream cin("1.txt");
	cin >> T;
	while(T--){
		//cin >> N >> M;
		scanf("%d%d",&N,&M);
		char sign;
		int a,b,i;
		REP(i,N) parent[i] = -1;
		//parent.assign(N, -1);
		while(M--){
			//cin >> sign >> a >> b;
			cin >> sign;scanf("%d%d",&a,&b);
			if (sign == 'A'){
				PII p1 = getRoot(a);
				PII p2 = getRoot(b);
				if (p1.first != p2.first)
					printf("Not sure yet1.\n");
				else if (p1.second%2 == p2.second%2)
					printf("In the same g1ang.\n");
				else 
					printf("In differ2ent gangs.\n");
			}
			else merge(a, b);
		}
	}
	return 0;
}


Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator