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

本来以为是水题,结果A得很痛苦。。。

Posted by VecKor at 2015-03-09 00:34:32 on Problem 1703 and last updated at 2015-03-09 00:37:26
//本人菜鸟一枚,还在凌乱的小伙伴可以看看
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
int par[100010], dpar[100010], r[100010];//r是根的高度,dpar[i]==j表示i与j对立
bool vs[100010];
int find(int x)
{
	if (x == par[x])return x;
	else return par[x] = find(par[x]);
}
void unite(int x, int y)
{
	int a = find(x), b = find(y);
	if (a != b)
	{
		if (r[a] < r[b])par[a] = b;
		else par[b] = a;
		if (r[a] == r[b])r[a]++;
	}
	return;
}
void init(int n)
{
	memset(dpar, -1, sizeof(dpar));
	memset(vs, 0, sizeof(vs));
	memset(r, 0, sizeof(r));
	for (int i = 0; i <= n; i++)par[i] = i;
	return;
}
int main()
{
	char s;
	int a, b, tes, n, m ;
	scanf("%d", &tes);
	while(tes--)
	{
		scanf("%d%d", &n, &m);
		init(n);
		while (m--)
		{
			cin >> s ;
			scanf("%d%d", &a, &b);
			if (s == 'D')
			{
				if (!vs[a])dpar[a] = b;
				if (!vs[b])dpar[b] = a;
				vs[a] = vs[b] = 1;
				unite(dpar[a], b);
				unite(dpar[b], a);
				continue;
			}
			if (s == 'A')
			{
				if (find(a) == find(b))printf("In the same gang.\n");
				else if (find(dpar[a]) == find(b))printf("In different gangs.\n");//别用find(a)!=find(b)判断(此处凌乱几小时··)
				else printf("Not sure yet.\n");
			}
		}
	}
}

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