歐拉回路 Codeforces723E One-Way Reform
題意:給你無向圖,現在給無向圖定向,使得最多的點,入度等於出度。
思路:首先,對於無向圖,奇數度的點,肯定是不能使得入度等於出度的。
對於一個有向圖歐拉回路,我們可以知道,歐拉回路上所有的點的入度等於出度。
然後,我們還能知道一個性質,對於一個圖,度為奇數的個數,一定是偶數。
所以我們把度為奇數的點分成很多組,每組2個點,然後把每組內部的2個點連一條邊。
這樣的話,整個圖,就只有度為偶數的點了。然後我們再跑歐拉回路,就能得到答案了。
能看到這個題想到歐拉回路,這個想法實在是太跳躍了!得開啟思維才行。
#include <map> #include <set> #include <cmath> #include <ctime> #include <stack> #include <queue> #include <cstdio> #include <cctype> #include <bitset> #include <string> #include <vector> #include <cstring> #include <iostream> #include <algorithm> #include <functional> #define fuck(x) cout<<"["<<x<<"]"; #define FIN freopen("input.txt","r",stdin); #define FOUT freopen("output.txt","w+",stdout); using namespace std; typedef long long LL; typedef pair<int, int> PII; const int MX = 1e5 + 5; const int INF = 0x3f3f3f3f; struct Edge { int v, sign, nxt; } E[MX]; int Head[MX], erear; void edge_init() { erear = 0; memset(Head, -1, sizeof(Head)); } void edge_add(int u, int v, int sign) { E[erear].v = v; E[erear].sign = sign; E[erear].nxt = Head[u]; Head[u] = erear++; } int n, m; int IN[MX]; vector<int> one; bool vis[MX], used[MX]; void Fleury(int u) { used[u] = 1; for(int i = Head[u]; ~i; i = Head[u]) { Head[u] = E[i].nxt; if(!vis[i | 1]) { int v = E[i].v; vis[i | 1] = 1; if(E[i].sign) printf("%d %d\n", u, v); Fleury(v); } } } int main() { int T; //FIN; scanf("%d", &T); while(T--) { edge_init(); scanf("%d%d", &n, &m); memset(vis, 0, sizeof(vis)); memset(used, 0, sizeof(used)); memset(IN, 0, sizeof(IN)); one.clear(); for(int i = 1; i <= m; i++) { int u, v; scanf("%d%d", &u, &v); edge_add(u, v, 1); edge_add(v, u, 1); IN[u]++; IN[v]++; } int ans = 0; for(int i = 1; i <= n; i++) { if(IN[i] % 2) one.push_back(i); else ans++; } for(int i = 0; i + 1 < one.size(); i += 2) { int u = one[i], v = one[i + 1]; edge_add(u, v, 0); edge_add(v, u, 0); } printf("%d\n", ans); for(int i = 1; i <= n; i++) { if(!used[i]) Fleury(i); } } return 0; }
相關推薦
歐拉回路 Codeforces723E One-Way Reform
題意:給你無向圖,現在給無向圖定向,使得最多的點,入度等於出度。 思路:首先,對於無向圖,奇數度的點,肯定是不能使得入度等於出度的。 對於一個有向圖歐拉回路,我們可以知道,歐拉回路上所有的點的入度等於出度。 然後,我們還能知道一個性質,對於一個圖,度為奇數的個數,一定是偶
Codeforces Round #375 (Div. 2) E - One-Way Reform 無向圖有向化+歐拉回路
本場詳細題解見:https://blog.csdn.net/xiang_6/article/details/83549528 題意&思路見上述連結 #include<bits/stdc++.h> using namespace std; #def
cf 723E One-Way Reform(歐拉回路)
One-Way Reform time limit per test 2 seconds memory limit per test 256 megabytes
codeforces #375(div.2) 723E One-Way Reform 歐拉回路或網路流
題意:n個點,m條無向邊,有迴路,無重邊,無自環,可以有孤立點。現要求把所有邊標上方向,使得目標點的數目最大,並輸出標上方向後的邊,目標點滿足其出度等於入度。 題解:自己不會,看了官方題解上網看了部落格,學會了第一種思路。 我們把開始把所有點的度統計出來,假設所有的點度都
[歐拉回路 構造 || 網路流] Codeforces 723E #375 (Div. 2) E. One-Way Reform
通過歐拉回路構造 稱度為偶數的點為偶點 度為奇數為奇點 偶點可以滿足條件 而奇點不能 肯定可以通過只加奇點之間的邊使得存在歐拉回路 然後求歐拉回路 把加的邊刪去 對偶點無影響 那麼就能使所有偶點滿足
codeforces 723E. One-Way Reform(歐拉回路||網路流)
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output There are n c
codeforces 723e One-Way Reform (歐拉回路) || 歐拉回路路徑輸出模板
There are n cities and m two-way roads in Berland, each road connects two cities. It is known that there is no more than one road con
codeforces723E One-Way Reform(尤拉通路)
第一次打線上賽,1456分來著,感覺自己模擬題做的不怎麼樣,總是想複雜,而且寫程式碼慢的要死,這套題說實話還算簡單,但只A了兩道,其他的題都很基礎,這題尤拉通路我剛好不會,所以寫一下。 題意: n個城市之間m條雙向道路,現在把雙向道路變成單向,求讓出入度相同的城市最多的路線
歐拉回路
put ++ .cn -1 bool ret 技術分享 代碼 can 思路 根據歐拉圖的概念來。 註意 點數為1; 有孤立點; 代碼實現 T掉的dfs... 1 #include<cstdio> 2 const int max
UVA 10196 Morning Walk(歐拉回路)
ble move eve man first pre intersect sum ons Problem H Morning Walk Time Limit 3 Seconds Kamalis a Motashotaguy. He has
[歐拉回路] poj 1300 Door Man
linker center || 是否 connect sep cto -m vector 題目鏈接: http://poj.org/problem?id=1300 Door Man Time Limit: 1000
hdu1878歐拉回路(DFS+歐拉回路)
out sin 整數 white 偶數 ret pad bottom -m 歐拉回路 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
[模板][持續更新]歐拉回路與歐拉路徑淺析
bits solution 算法 -1 要求 logs 鏈式前向星 namespace src Luogu P2731 騎馬修柵欄 Riding the Fences 題目背景 Farmer John每年有很多柵欄要修理。他總是騎著馬穿過每一個柵欄並修復它破損的地方。 題目
51nod 1967 路徑定向(不錯的歐拉回路)
cnblogs 偶數 ret mes stack ostream lin .html pre http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967 題意: 思路: 出度=入度,這
The Necklace UVA - 10054 (無向圖的歐拉回路)
n) 兩個 logs nec get dfs lap none view The Necklace UVA - 10054 題意:每個珠子有兩個顏色,給n個珠子,問能不能連成一個項鏈,使得項鏈相鄰的珠子顏色相同。 把顏色看做點,珠子內部連一條邊,無向圖求歐拉回路。 這
算法復習——歐拉回路混合圖(bzoj2095二分+網絡流)
n) truct lin 歐拉圖 所有 mage borde algo stream 題目: Description YYD為了減肥,他來到了瘦海,這是一個巨大的海,海中有n個小島,小島之間有m座橋連接,兩個小島之間不會有兩座橋,並且從一個小島可以到另外任意一個小島。現在
混合圖歐拉回路
所有 ace .cn geo urn 我們 方向 online n) http://acm.pku.edu.cn/JudgeOnline/problem?id=1273 給一組邊 有的是有向邊有的是無向邊 問是否存在歐拉回路 我們知道如果每個點入度等於出度 就存在歐拉回路
hdu 1956 (網絡流解決歐拉回路)
www 起點到終點 更改 什麽 tps 網絡流 個性 http 混合圖 題目連接:https://vjudge.net/problem/HDU-1956 題意:給定一些點和一些邊,有些邊是有向的,,有些邊是無向的,求是否存在歐拉回路。 題解:想不到的網絡流。 混合圖:即
51nod1967 路徑定向(歐拉回路+結論題)
void ++i col () view const stdio.h turn char 看到入度等於出度想到歐拉回路。 我們把邊都變成無向邊,有一個結論是偶數度的點都可以變成出入度相等的點,而奇數點的不行,感性理解分類討論一下就知道是對的。 還有一個更好理
poj1780歐拉回路
href tail poj scanf net str ons for lan 轉載 #include<cstdio> #include<cstring> const int N=1e6+88; bool vis[N]; char an