HDU 1878 尤拉迴路

2021-07-10 07:18:54 字數 2521 閱讀 7498

題意:

尤拉迴路的判斷條件,

一、無向圖

每個頂點的度數都是偶數,則存在尤拉迴路。

二、有向圖(所有邊都是單向的)

每個節頂點的入度都等於出度,則存在尤拉迴路。

以上兩種情況都很好理解。其原理就是每個頂點都要能進去多少次就能出來多少次。

三、混合圖(有的邊是單向的,有的邊是無向的。常被用於比喻城市裡的交通網路,有的路是單行道,有的路是雙行道。)

找到乙個給每條無向的邊定向的策略,使得每個頂點的入度等於出度,這樣就能轉換成上面第二種情況。這就可以轉化成乙個二部圖最大匹配問題。網路模型如下:

新建乙個圖。

對於原圖中每一條無向邊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條邊,每行給出一對正整數,分別是該條邊直接連通...