记录编号 47651 评测结果 AAAAAAAAAA
题目名称 [NOIP 2010冲刺四]晨跑路径 最终得分 100
用户昵称 GravatarTruth.Cirno 是否通过 通过
代码语言 C++ 运行时间 0.053 s
提交时间 2012-11-02 18:54:41 内存使用 3.30 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <memory.h>
using namespace std;

int ava,ptop[2010],wayto[16010],waynext[16010];
int n,total,ind,tim[2010],timlow[2010];
bool ok,visited[2010],ans[2010];

void putway(int pos,int to)
{
	if (!ptop[pos])
	{
		ava++;
		ptop[pos]=ava;
		wayto[ava]=to;
	}
	else
	{
		int poi;
		poi=ptop[pos];
		while (waynext[poi])
			poi=waynext[poi];
		ava++;
		waynext[poi]=ava;
		wayto[ava]=to;
	}
}

void tarjan(int pos,int lastpos)
{
	ind++;
	tim[pos]=ind;
	timlow[pos]=ind;
	int poi,to;
	poi=ptop[pos];
	while (poi)
	{
		to=wayto[poi];
		if (tim[to]==0)
		{
			tarjan(to,pos);
			timlow[pos]=min(timlow[pos],timlow[to]);
			if(timlow[to]>=tim[pos])
			{
				if (pos!=1&&pos!=n)
				{
					if (!ans[pos])
					{
						total++;
						ans[pos]=true;
					}
				}
			}
		}
		else if (to!=lastpos)
		{
			timlow[pos]=min(timlow[pos],tim[to]);
		}
		poi=waynext[poi];
	}
}

void dfs(int pos)
{
	visited[pos]=true;
	if (pos==n)
		ok=true;
	int poi,to;
	poi=ptop[pos];
	while (poi)
	{
		to=wayto[poi];
		if (!visited[to])
		{
			dfs(to);
			if (ok)
				return;
		}
		poi=waynext[poi];
	}
}

int main(void)
{
	freopen("running.in","r",stdin);
	freopen("running.out","w",stdout);
	int i,m,a,b;
	cin>>n>>m;
	for (i=1;i<=m;i++)
	{
		cin>>a>>b;
		putway(a,b);
		putway(b,a);
	}
	tarjan(1,0);
	for (i=2;i<n;i++)
		if (ans[i])
		{
			ok=false;
			memset(visited,0,sizeof(visited));
			visited[i]=true;
			dfs(1);
			if (ok)
			{
				total--;
				ans[i]=false;
			}
		}
	cout<<total<<endl;
	a=0;
	for (i=2;i<n;i++)
		if (ans[i])
		{
			if (a)
			{
				cout<<' '<<i;
			}
			else
			{
				a=1;
				cout<<i;
			}
		}
	if (a)
		cout<<endl;
	return(0);
}