1. 程式人生 > >歐拉回路 Codeforces723E One-Way Reform

歐拉回路 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