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

苍天啊,那位大牛能让我的程序AC啊!!!题目ID:2524

Posted by parire at 2009-08-20 16:43:35
#include <stdio.h>
#include <malloc.h>

void init();	//使每个节点的根节点都是本身
void contact();		//节点连接过程
void Father(int &x1, int &x2);						//连接到自己的根节点
void cal();							//计算根节点个数
int n, *member, result = 0, num = 0;

int main()
{
	init();
	do
	{
		num++;
		contact();
		cal();
		init();
	}while(n != 0);

	return 0;
}

void init()	//使每个节点的根节点都是本身
{
	scanf("%d", &n);
	if (n > 0 && n <= 50000)
		member = (int*)malloc(n*sizeof(int));
	else
		return;
	for (int i=0;i<n;i++)
	{
		member[i] = i;
	}
}

void contact()					//节点连接过程
{
	int m, x1, x2;
	scanf("%d", &m);
	if (m >= 0 && m <= n*(n-1)/2)

	for (int i=0;i<m;i++)
	{
		scanf("%d%d", &x1, &x2);
		Father(x1, x2);
	}
}

void Father(int &x1, int &x2)					//连接到自己的根节点
{
	int tmp1 = x1-1, tmp2 = x2-1;
	while (member[tmp1] != tmp1)
	{
		tmp1 = member[tmp1];
	}
	member[x1-1] = tmp1;
	while (member[tmp2] != tmp2)
	{
		tmp2 = member[tmp2];
	}
	member[x2-1] = tmp2;
	member[tmp1] = tmp2;
}

void cal()						//计算根节点个数
{
	result = 0;
	for (int i=0;i<n;i++)
	{
		result = (member[i] == i)? result+1 : result;
	}
	printf("case %d: %d\n", num, result);
}

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