luogu P2731 騎馬修柵欄 Riding the Fences | 歐拉道路
阿新 • • 發佈:2019-01-23
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 | 歐拉道路