骑马修栅栏 Riding the Fences
#include<bits/stdc++.h>
#define maxn 1100
using namespace std;
int n,usd[maxn],in[maxn];
bool vis[maxn][maxn];
multiset<int>G[maxn];
stack<int>sta;
void dfs(int now)
{
for(multiset<int>::iterator it=G[now].begin();it!=G[now].end();it=G[now].begin())
{
int tmp = *it;
G[tmp].erase(G[tmp].find(now));
G[now].erase(it);
dfs(tmp);
}
sta.push(now);
}
int main()
{
scanf("%d",&n);
for(int i=1,u,v;i<=n;i++)
{
scanf("%d%d",&u,&v);
G[u].insert(v),G[v].insert(u);
in[u]++,in[v]++;
}
int rt = 501 , rt2 = 501;
for(int i=500;i>=1;i--)
if(in[i] & 1)rt = i;
if(rt > 500) rt = 1;
dfs(rt);
for(;!sta.empty();)
printf("%d\n",sta.top()),sta.pop();
}
UPD:
O
(
n
)
O(n)
O(n)欧拉回路:
「POI2011 R2 Day1」垃圾运输 Garbage
#include<bits/stdc++.h>
#define maxm 2000005
using namespace std;
int n,m;
int in[maxm];
int info[maxm],Prev[maxm],to[maxm],cnt_e=1;
void Node(int u,int v){ Prev[++cnt_e]=info[u],info[u]=cnt_e,to[cnt_e]=v; }
int ans[maxm],K,tp,L[maxm],R[maxm],ed[maxm];
void dfs(int u,int hd=1){
for(int &i=info[u],v;i;i=Prev[i]) if((v=to[i]))
to[i]=to[i^1]=0,dfs(v),hd=1;
if(hd) ans[++tp] = u;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1,a,b,s,t;i<=m;i++){
scanf("%d%d%d%d",&a,&b,&s,&t);
if(s ^ t) Node(a,b),Node(b,a),in[a]++,in[b]++;
}
for(int i=1;i<=n;i++) if(in[i]&1) return puts("NIE"),0;
for(int i=1;i<=n;i++) dfs(i,0) , ed[tp] = 1;
int pr=1;
for(int i=2;i<=tp;i++) if(ans[i] == ans[pr]){
L[++K] = pr , R[K] = i;
i += ed[i];
pr = i;
}
printf("%d\n",K);
for(int i=1;i<=K;i++){
printf("%d ",R[i]-L[i]);
for(int j=L[i];j<=R[i];j++)
printf("%d%c",ans[j]," \n"[j==R[i]]);
}
}