比赛 20101117 评测结果 AWWWWTAWWW
题目名称 邮递员 最终得分 20
用户昵称 .Xmz 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-11-17 11:16:13
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cstdio>

using namespace std;

int n,m;
int f[201][201];
bool y[201];
int last[201];
int bo[201];
struct node
{
	node *next;
	int x,id;
}P[10001];
int pn;
void add(int i,int s,int u)
{
	P[++pn].next=P[i].next;
	P[pn].x=u;
	P[pn].id=pn;
	P[i].next=P+pn;
	if (last[u] && last[u]!=s) add(i,s,last[u]);
}

bool dfs(int s,int u)
{
	y[u]=true;
	for (int v=1;v<=n;v++)
	if (f[u][v] && (!y[v] || v==s))
	{
		f[u][v]--;f[v][u]--;
		last[v]=u;
		if (v==s) return true;
		if (dfs(s,v)) return true;
		last[v]=0;
		f[u][v]++;f[v][u]++;
	}
	y[u]=false;
	return false;
}
void ol(int i)
{
	int u=P[i].x;
	if (bo[u]) return;
	bo[u]=true;
	do
	{
		int t=pn;
		if (last[u]) 
		{add(i,u,u);i=t+1;}
		memset(y,0,sizeof(y));
		memset(last,0,sizeof(last));
	}while (dfs(u,u));
}

int main()
{
	freopen("carrier.in","r",stdin);
	freopen("carrier.out","w",stdout);
	scanf("%d%d",&n,&m);
	int t;
	for (int i=1;i<=n;i++) scanf("%d",&t);
	int a,b;
	for (int i=1;i<=m;i++)
	{
		scanf("%d%d",&a,&b);
		f[a][b]++;
		f[b][a]++;
	}
	P[++pn].x=1;P[1].id=1;
	ol(1);
	int u=1;
	while(P[u].next)
	{
		u=P[u].next->id;
		ol(u);
	}
	printf("%d\n",pn-1);
	t=0;int now=1;
	while (t<pn-1)
	{
		t++;
		printf("%d ",P[now].x);
		now=P[now].next->id;
	}
	printf("1\n");
	return 0;
}