您的位置:首页 > 其它

ural 1056. Computer Net

2011-05-15 15:21 302 查看
这题,纠结好久了。题意是,给你一颗树,求到达其他端点最远距离最近的点。



昨晚想出来一种方法,但是实现很有问题。就是删度为1的点,一直删到剩下的点度都为1为止。但是这个实现起来很麻烦啊。。。T T 。。



党姐今天说了他的想法,就是找最长链,然后求得的点要么是一个要么是两个,所以肯定是最长链中间的那一个或者两个。找最长链是,随意从一个点出发,找到离它最远的一个点,然后再由这个点找最长链。



刚实现了下,觉得没啥问题,在第九组crash了。。。T T 。。。。以为DFS不行呢,改成BFS依然crash。。。又一看,发现,我建的图的边是双向边 T T。。。数组少开了一半。。。交后A掉 T T 。。





双 DFS



#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAX = 10010;
typedef struct NODE{
	int num;
	NODE *next;
}NODE;
NODE *map[MAX],node[2*MAX];
bool used[MAX];
int n,cou;
int s;
int len,maxlen;
int out[MAX];
int t[MAX],p;
void init()
{
	memset(used,false,sizeof(used));
	memset(map,'/0',sizeof(map));
	cou = 0;
}
void Add(int from,int to)
{
	node[cou].num = to;
	node[cou].next = map[from];
	map[from] = &node[cou++];
}
void DFS(int x)
{
	if( len > maxlen )
	{
		maxlen = len;
		s = x;
	}
	used[x] = true;
	NODE *head = map[x];
	while( head != NULL )
	{
		if( !used[head->num] )
		{
			len++;
			DFS(head->num);
			len--;
		}
		head = head->next;
	}
}
void DFS2(int x)
{
	t[len] = x;
	used[x] = true;
	NODE *head = map[x];
	bool flag = false;
	while( head != NULL )
	{
		if( !used[head->num] )
		{
			flag = true;
			len++;
			DFS2(head->num);
			len--;
		}
		head = head->next;
	}
	
	if( !flag && len > maxlen )
	{
		maxlen = len;
		memcpy(out,t,sizeof(t));
	}
}
int main()
{
	int to;	
	scanf("%d",&n);
	init();
	for(int i=2; i<=n; i++)
	{
		scanf("%d",&to);
		Add(i,to);
		Add(to,i);
	}
	len = maxlen = 0;
	memset(used,0,sizeof(used));
	DFS(1);
	
	memset(used,0,sizeof(used));
	len = maxlen = 0;
	DFS2(s);
	
	maxlen++;
	if( maxlen % 2 == 1 )
		printf("%d/n",out[maxlen/2]);
	else
	{
		int a = out[maxlen/2-1];
		int b = out[maxlen/2];
		printf("%d %d/n",min(a,b),max(a,b));
	}
return 0;
}






BFS+DFS



#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAX = 10010;
typedef struct NODE{
	int num;
	NODE *next;
}NODE;
NODE *map[MAX],node[2*MAX];
bool used[MAX];
int n,cou;
int s;
int len,maxlen;
int out[MAX];
void init()
{
	memset(map,'/0',sizeof(map));
	cou = 0;
}
void Add(int from,int to)
{
	node[cou].num = to;
	node[cou].next = map[from];
	map[from] = &node[cou++];
}
void DFS(int x)
{
	if( len > maxlen )
	{
		maxlen = len;
		s = x;
	}
	used[x] = true;
	NODE *head = map[x];
	while( head != NULL )
	{
		if( !used[head->num] )
		{
			len++;
			DFS(head->num);
			len--;
		}
		head = head->next;
	}
}
int pre[MAX];
int e;
typedef struct LA{ int t,ind;}LA;
queue<LA> q;
void BFS(int s)
{
	for(int i=0; i<=n; i++)
		pre[i] = i;
	LA tmp; tmp.t = 0; tmp.ind = s;
	q.push(tmp);
	while( !q.empty() )
	{
		LA tmp = q.front(); q.pop();
		if( tmp.t > maxlen )
		{
			maxlen = tmp.t;
			e = tmp.ind;
		}
		NODE *head = map[tmp.ind];
		while( head != NULL )
		{
			if( !used[head->num] )
			{
				used[head->num] = true;
				pre[head->num] = tmp.ind;
				LA y; y.t = tmp.t+1;
				y.ind = head->num;
				q.push(y);
			}
			head = head->next;
		}
	}
}

int main()
{
	int to;	
	scanf("%d",&n);
	init();
	for(int i=2; i<=n; i++)
	{
		scanf("%d",&to);
		Add(i,to);
		Add(to,i);
	}
	
	len = maxlen = 0;
	memset(used,0,sizeof(used));
	DFS(1);
	
	memset(used,0,sizeof(used));
	maxlen = 0;
	used[s] = 1;
	BFS(s);
	int p = 0;
	while( pre[e] != e )
	{
		out[p++] = e;
		e = pre[e];
	}
	out[p++] = e;
	if( p % 2 == 1 )
		printf("%d/n",out[p/2]);
	else
	{
		int a = out[p/2-1];
		int b = out[p/2];
		printf("%d %d/n",min(a,b),max(a,b));
	}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: