題意:
尤拉迴路的判斷條件,代價:一、無向圖
每個頂點的度數都是偶數,則存在尤拉迴路。
二、有向圖(所有邊都是單向的)
每個節頂點的入度都等於出度,則存在尤拉迴路。
以上兩種情況都很好理解。其原理就是每個頂點都要能進去多少次就能出來多少次。
三、混合圖(有的邊是單向的,有的邊是無向的。常被用於比喻城市裡的交通網路,有的路是單行道,有的路是雙行道。)
找到乙個給每條無向的邊定向的策略,使得每個頂點的入度等於出度,這樣就能轉換成上面第二種情況。這就可以轉化成乙個二部圖最大匹配問題。網路模型如下:
新建乙個圖。
對於原圖中每一條無向邊i,在新圖中建乙個頂點e(i);
對於原圖中每乙個頂點j,在新圖中建乙個頂點v(j)。
如果在原圖中,頂點j和k之間有一條無向邊i,那麼在新圖中從e(i)出發,新增兩條邊,分別連向v(j)和v(k),容量都是1。
在新圖中,從源點向所有e(i)都連一條容量為1的邊。
對於原圖中每乙個頂點j,它原本都有乙個入度in、出度out和無向度un。顯然我們的目的是要把所有無向度都變成入度或出度,從而使它的入度等於總度數的一半,也就是(in + out + un) / 2(顯然與此同時出度也是總度數的一半,如果總度數是偶數的話)。當然,如果in已經大於總度數的一半,或者總度數是奇數,那麼尤拉迴路肯定不存大。如果in小於總度數的一半,並且總度數是偶數,那麼我們在新圖中從v(j)到匯點連一條邊,容量就是(in + out + un) / 2 – in,也就是原圖中頂點j還需要多少入度。
按照這個網路模型算出乙個最大流,如果每條從v(j)到匯點的邊都達到滿流量的話,那麼尤拉迴路成立。
//
// created by cqu_cst_wuerli
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define clr(x) memset(x,0,sizeof(x))
#define off(x) memset(x,-1,sizeof(x))
#define mem(x,a) memset((x),(a),sizeof(x))
#define bug cout << "i am here" << endl
#define lookln(x) cout << #x << "=" << x << endl
#define si(a) scanf("%d",&a)
#define sii(a,b) scanf("%d%d",&a,&b)
#define siii(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define rep(flag,start,end) for(int flag=start;flag<=end;flag++)
#define rep(flag,start,end) for(int flag=start;flag>=end;flag--)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root 1,n,1
const
int inf_int=0x3f3f3f3f;
const
long
long inf_ll=0x7fffffff;
const
int mod=1e9+7;
const
double eps=1e-9;
const
double pi=acos(-1);
typedef
long
long ll;
using
namespace
std;
const
int n=1010;
int n,m;
vector
g[n];
int vis[n];
int deg[n];
void dfs(int u)
}int main(int argc, char
const *argv)
int ans=1;
clr(vis);
dfs(1);
rep(i,1,n) if (!vis[i]) ans=0;
int cnt=0;
rep(i,1,n) if (deg[i]%2==1) cnt++;
if (cnt) ans=0;
cout
<< ans << endl;
}return
0;}
HDU1878 尤拉迴路
problem description 尤拉迴路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定乙個圖,問是否存在尤拉迴路?input 測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數n 1 n 1000 和邊數m 隨後的m行對應m條邊,每行給出...
HDU 1878 尤拉迴路
演算法思想 判斷乙個圖中是否存在尤拉迴路 每條邊恰好只走一次,並能回到出發點的路徑 在以下三種情況中有三種不同的演算法 一 無向圖 每個頂點的度數都是偶數,則存在尤拉迴路。二 有向圖 所有邊都是單向的 每個節頂點的入度都等於出度,則存在尤拉迴路。以上兩種情況都很好理解。其原理就是每個頂點都要能進去多...
HDU 1878 尤拉迴路
題目描述 尤拉迴路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定乙個圖,問是否存在尤拉迴路?輸入描述 測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數n 1 n 1000 和邊數m 隨後的m行對應m條邊,每行給出一對正整數,分別是該條邊直接連通...