比赛 |
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);
}