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

大牛帮忙看看,为什么会超时?

Posted by oeym at 2006-03-13 23:10:07 on Problem 1655
In Reply To:晕,TLE了 Posted by:oeym at 2006-03-13 23:08:19
#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
	int id;
	struct Node * next;
} Node;

Node nd[20001];
int st[20001];
int SZ, N;
int count;

void Insert(int h, int k)
{
	Node *p;
	p = &nd[h];
//	printf("s = %d e = %d\n", h, k);
	while (p->next != NULL)
	{
//		printf("++\n");
		p = p->next;
	}
	p->next = (Node *)malloc(SZ);
	p = p->next;
	p->id = k;
	p->next = NULL;
}

void DFS(int id)
{
	Node *p;
	count++;
	p = nd[id].next;

	while (p != NULL)
	{
		if (st[p->id] == 0)
		{
			st[p->id] = 1;
			DFS(p->id);
		}
		p = p->next;
	}
}

int calc(int k)
{
	int i;
	Node *p;
	int max;
	max = 0;
	for (i = 1; i <= N; i++)
	{
		st[i] = 0;
	}
	st[k] = 1;
	
	p = nd[k].next;

	while (p != NULL)
	{
		if (st[p->id] == 0)
		{
			st[p->id] = 1;
			count = 0;
			DFS(p->id);
			if (count > max)
			{
				max = count;
			}
		}
		p = p->next;
	}
	return max;
}

int main()
{
	int T, i, s, e, min, minid, tmp;
	Node *p;
	freopen("PKU1655.in", "r", stdin);
	scanf("%d", &T);
	SZ = sizeof(nd[0]);

	while (T--)
	{
		scanf("%d", &N);
		for (i = 0; i < N - 1; i++)
		{
			scanf("%d %d", &s, &e);
			Insert(s, e);
			Insert(e, s);
		}

		min = calc(1);
		minid = 1;
		for (i = 2; i <= N; i++)
		{
			tmp = calc(i);
//			printf("tmp = %d\n", tmp);
			if (min > tmp)
			{
				min = tmp;
				minid = i;
			}
		}
		printf("%d %d\n", minid, min);
	}
	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