1. 程式人生 > >luogu P2731 騎馬修柵欄 Riding the Fences | 歐拉道路

luogu P2731 騎馬修柵欄 Riding the Fences | 歐拉道路

www break include printf 最小 表示 text 等於 problem

luogu P2731 騎馬修柵欄 Riding the Fences

luogu P1341 無序字母對

度數:一個點上連接邊的個數

1.歐拉道路:相當於一筆畫

無向圖:除了兩個或沒有點為奇點(度數為奇)以外,其余度數均為偶

有向圖:只有兩個點或沒有點入度不等於出度,起點入度=出度-1,終點入度=出度+1

2.歐拉回路:

無向圖:奇點個數為0

有向圖:所有點出度=入度(起點終點重合)

#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=2500;
int f,head[maxn],nxt[maxn],to[maxn],du[maxn],cnt=-1
,t,zhan[maxn],vis[maxn]; void add(int a,int b) { cnt++; nxt[cnt]=head[a]; to[cnt]=b; head[a]=cnt; } void dfs(int k) { while(du[k]) { int mi=2e9,tomi=2e9; for(int i=head[k];i!=-1;i=nxt[i]) { if(!vis[i]&&to[i]<tomi) mi=i,tomi=to[i]; //
題中要求存在多組解的情況下,輸出進制表示法中最小的一個 } vis[mi]=1; vis[mi^1]=1; du[k]--; du[tomi]--; dfs(tomi); zhan[++t]=tomi; } } int main() { scanf("%d",&f); int a,b,minn=2e9; for(int i=0;i<1050;i++) head[i]=-1; for(int i=1;i<=f;i++) { scanf(
"%d%d",&a,&b); add(a,b); add(b,a); du[a]++; du[b]++; minn=min(min(a,b),minn); } for(int i=1;i<=f;i++) { if(du[i]%2==1) { minn=i; break; } } dfs(minn); printf("%d\n",minn); for(int i=t;i>0;i--) printf("%d\n",zhan[i]); return 0; }

luogu P2731 騎馬修柵欄 Riding the Fences | 歐拉道路