1. 程式人生 > >判歐拉回路或求一個圖中尤拉圖的個數

判歐拉回路或求一個圖中尤拉圖的個數

判尤拉圖兩個條件首先聯通,其次度全部為歐度。那麼就很easy了。
題目:hdoj1878

求一個圖中尤拉圖的個數。
首先通過連通性求出各個子圖,然後求子圖中奇數度的個數cnt,cnt/2為尤拉圖的個數。若子圖沒有奇數度,則為一個歐拉回路。
題目:hdoj3018Ant Trip
注意這個題目中可能出現孤立點,不算入尤拉圖中。

AC程式碼:

#include <cstdio>
#include <vector>
#include <iostream>
#include <stack>
#include <cstdio>
#include <string>
#include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <vector> using namespace std; const int inf = 0x3f3f3f3f; const int N = 100030; int cnt[N]; int ans,cou; vector<int> g[N]; bool ok[N]; void dfs(int x) { for(int i=0;i<g[x].size();i++) { int
to = g[x][i]; if(ok[to]==false) { ok[to] = true; cou+=cnt[to]%2; dfs(to); } } } void solve(int n) { for(int i=1;i<=n;i++){ //尤拉道路 if(ok[i]==false) { if(g[i].size()==0) { ok[i] = true
; continue; } cou = cnt[i]%2; ok[i] = true; dfs(i); if(cou==0) ans++; //迴路 else ans+=cou/2; } } } int main() { int n,m; while(~scanf("%d",&n) && n) { memset(cnt,0,sizeof(cnt)); scanf("%d",&m); for(int i=0;i<m;i++) { int x,y; scanf("%d%d",&x,&y); g[x].push_back(y); g[y].push_back(x); cnt[x]++; cnt[y]++; } memset(ok,false,sizeof(ok)); ans = 0; solve(n); printf("%d\n",ans); for(int i=0;i<=n;i++) g[i].clear(); } return 0; }