P2731 騎馬修柵欄


洛谷

課本Page 466

定理1:存在歐拉路的條件,圖是連通的,有且只有 2 個奇點;
定理2:存在歐拉回路的條件,圖是連通的,有 0 個奇點;

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
using namespace std;
int F,q[501][501],n=0,ans[1300],du[501],cnt=0;//500*500 鄰接矩陣 du[]用來記錄每個點的度 (相連的邊的個數)
void dfs(int x)
{
for(int i=1;i<=n;i++)
{
if(q[x][i])//從任意一個與它相連的點出發
{
q[x][i]--;//刪去便利完的邊
q[i][x]--;
dfs(i);
}
}
ans[++cnt]=x;//記路徑,不過是倒着記的(遞歸)
}
int main()
{
scanf("%d",&F);
for(int i=1;i<=F;i++)
{
int x,y;
scanf("%d%d",&x,&y);
q[x][y]++;
q[y][x]++;
du[x]++;
du[y]++;
n=max(n,max(x,y));

}
int start=1;
for(int i=1;i<=n;i++)
if(du[i]%2==1){start=i;break;}//如果有奇點,就從奇點開始尋找,沒有就從 1 開始
//如果無奇點,就是一個歐拉回路(因為每一個點都是偶點)
dfs(start);

for(int i=cnt;i>=1;i--)
printf("%d\n",ans[i]);

return 0;
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com