判歐拉回路或求一個圖中尤拉圖的個數
阿新 • • 發佈:2019-02-07
判尤拉圖兩個條件首先聯通,其次度全部為歐度。那麼就很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;
}