比赛 20120418s 评测结果 AAAAAAAAAA
题目名称 捉迷藏 最终得分 100
用户昵称 Citron酱 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-04-18 08:55:06
显示代码纯文本
#include <cstdio>
#include <climits>

#define I_F "hideseek.in"
#define O_F "hideseek.out"

const int MAXn=20000;

struct str
{
	int x;
	str *next;
}*map[MAXn]={NULL};
int n,ans1,ans2,ans3;

void Input();
void Spfa();
void Output();

int main()
{
	Input();
	Spfa();
	Output();
	return 0;
}

void Input()
{
	unsigned int m;
	int a,b;
	str *t;
	freopen(I_F,"r",stdin);
	scanf("%d%d",&n,&m);
	for (unsigned int i=0; i<m; i++)
	{
		scanf("%d%d",&a,&b);
		t=map[--a];
		map[a]=new str;
		map[a]->x=--b;
		map[a]->next=t;
		t=map[b];
		map[b]=new str;
		map[b]->x=a;
		map[b]->next=t;
	}
}

void Spfa()
{
	int d[MAXn];
	for (int i=1; i<n; d[i++]=INT_MAX);
	d[0]=0;
	str *head, *tail, *temp;
	head=new str;
	head->x=0;
	head->next=NULL;
	tail=head;
	str *p[MAXn]={NULL};
	p[0]=head;
	
	while (head!=NULL)
	{
		for (str *i=map[head->x]; i!=NULL; i=i->next)
			if (d[head->x]+1<d[i->x])
			{
				d[i->x]=d[head->x]+1;
				if (p[i->x]==NULL)
				{
					temp=new str;
					temp->x=i->x;
					p[i->x]=temp;
					if (head->next!=NULL && d[i->x]<d[head->next->x])
					{
						temp->next=head->next;
						head->next=temp;
					}
					else
					{
						tail->next=temp;
						tail=tail->next;
						tail->next=NULL;
					}
				}
			}
		temp=head;
		head=head->next;
		delete temp;
	}
	
	ans1=1;
	ans3=1;
	for (int i=2; i<n; i++)
		if (d[i]>d[ans1])
			ans1=i,
			ans3=1;
		else if (d[i]==d[ans1])
			ans3++;
	ans2=d[ans1];
}

void Output()
{
	freopen(O_F,"w",stdout);
	printf("%d %d %d\n",ans1+1,ans2,ans3);
}