尤拉路徑 hdu 3018 Ant Trip

2021-06-21 01:20:28 字數 2047 閱讀 3177

給定乙個無向圖,每條邊只走一次,可以有多個出發點,最多要多少個出發點?(不考慮孤立點)

即找至少需要多少個尤拉路徑

首先判斷聯通分量。再在每個連通分量中,奇數度點個數為0,需要出發點1個(尤拉迴路);奇數度點位非0個(記為cnt),需要出發點cnt / 2個

乙個連通圖(無向圖)中,奇數度點的個數為偶數個。

證明:簡單說,所有點的度數之和等於邊的個數的2倍,為偶數,所以奇數度點的個數為偶數個

圖中點的個數記為n,邊的個數記為m,則所有點度的和為2m(偶數),偶數度點的度之和為sum_even(顯然為偶數),則2m - sum_even(也為偶數)表示奇數度點的度之和。

每個奇數度點可以表示為2a(i)+1;設奇數度點個數為num_old,則有num_old+ 2(a(1)...+...a(num_old))= 2m - sum_even(偶數),則num_old為偶數,因此得證。

一連通圖(無向圖)中,奇數度點有cnt個(非0),則需要出發點個數為cnt/2;

cnt/2的解一定是可以構造出來的。

但是為什麼能保證是最少的呢????下面是自己的理解:

走乙個環時,只能最多減少0個奇數度的點。走乙個非環的路徑時,只能最多減少2個奇數度的點。(正確性???)

則一條路徑,一條路徑的走。每走完一條路徑之後圖中減少2個奇數度的點。最後減少到只有2個奇數度個點,則此時乙個尤拉路徑走完。所以共有至少cnt/2個;

並查集解法:

//#pragma warning (disable: 4786)

//#pragma comment (linker, "/stack:16777216")

//head

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

//loop

#define fe(i, a, b) for(int i = (a); i <= (b); ++i)

#define fd(i, b, a) for(int i = (b); i>= (a); --i)

#define rep(i, n) for(int i = 0; i < (n); ++i)

#define clr(a,value) memset(a,value,sizeof(a))

#define cpy(a, b) memcpy(a, b, sizeof(a))

#define fc(it, c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)

//input

#define ri(n) scanf("%d", &n)

#define rii(n, m) scanf("%d%d", &n, &m)

#define riii(n, m, k) scanf("%d%d%d", &n, &m, &k)

#define rs(s) scanf("%s", s)

typedef long long ll;

const int inf = 1000000007;

const double eps = 1e-10;

const int maxn = 200010;

int n, m;

int fa[maxn];

int num[maxn];///記錄連通分量中點的個數

int sum_old[maxn];///記錄連通分量中奇數度點的個數

int x[maxn], y[maxn];

void init(int n)

}int find(int x)

int main ()

for (int i = 0; i < m; i++)

}int ans = 0;

for (int i = 1; i <= n; i++)

}cout << ans << endl;

}return 0;

}

HDU 3018 Ant Trip(尤拉路的條數)

題目位址 題意 告訴你乙個無向圖,問你要一筆畫多少次才能把所有邊都畫一遍,且每條邊僅畫一遍。思路 如果你還沒有理解或者不知道尤拉圖的概念的話,可以看我的另一篇部落格 傳送門,那裡詳細的講了有向圖無向圖的尤拉圖的概念。言歸正傳,這題其實也是一道裸的尤拉鏈路的題目,他其實一筆畫就是要找到邊能全部連起來,...

hdu 3018(尤拉路 並查集)

傳送門 題解 對於一般的無向連通圖,如果有x個點入度為奇數,覆蓋所有邊所需要的筆數是max x 2,1 嚴格證明戳這兒。可以理解為用x 2筆消掉多出來的邊,取1的時候圖是乙個尤拉圖。p.s.注意特判 include include include include using namespace st...

hdu5348 尤拉迴路 尤拉路徑

題意 n個點m條邊的無向圖,問是否滿足將所有邊變為有向後,每個點入度和出度的點不超過1 include include include include include using namespace std struct nodeg 1000005 int cnt,sign,deg 200005 h...