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