1967 路徑定向

2021-08-04 07:08:40 字數 802 閱讀 4855

給出乙個有向圖,要求給每條邊重定向,使得定向後出度等於入度的點最多,輸出答案和任意一種方案

input

第一行兩個正整數n,m,表示1-n號點與m條邊

接下來m行,每行兩個正整數xi,yi,表示存在一條有向邊從xi指向yi

n≤10^5,   m≤3*10^5,   xi,yi≤n

output

第一行乙個整數ans,表示定向後出度等於入度的最大點數

第二行乙個長度為m的01字串,第i位為0表示第i條邊不改向,第i位為1表示第i條邊改變方向

input示例

7 7

1 22 3

2 34 5

1 56 7

6 7

output示例

5

0010110

題解:找出所有的奇點,為所有奇點新增一條邊(即任意兩個奇點相連),然後圖就會分成了幾個有迴路的連通塊,再跑一遍dfs(),求尤拉迴路,確定邊的方向,因為尤拉迴路可以保證所有的偶點出入度相等。

(陣列盡量開大,輸出的是字串)

#include#include#includeusing namespace std;

const int maxn=1e6+10;

struct edgee[maxn];

int n,m,du[maxn],ans[maxn];

bool vis[maxn];

vectorp[maxn],v;

void dfs(int cur){

vis[cur]=1;

for(int i=0;i

51Nod1967 路徑定向

給出乙個有向圖,要求給每條邊重定向,使得定向後出度等於入度的點最多,輸出答案和任意一種方案 input 第一行兩個正整數n,m,表示1 n號點與m條邊 接下來m行,每行兩個正整數xi,yi,表示存在一條有向邊從xi指向yi n 10 5,m 3 10 5,xi,yi n output 第一行乙個整數...

51NOD 1967 路徑定向

給出乙個有向圖,要求給每條邊重定向,使得定向後出度等於入度的點最多,輸出答案和任意一種方案.n 10 5,m 3 10 5,xi,yi n 考慮先當每條邊雙向。如果這個圖的所有點的度都是偶數,那麼尤拉路徑跑一下就行了 考慮度為奇數的點 連線所有度為奇數的點,使其成為偶數點,顯然不會影響正確性 留個坑...

51nod1967 路徑定向(尤拉迴路 結論題)

看到入度等於出度想到尤拉迴路。我們把邊都變成無向邊,有乙個結論是偶數度的點都可以變成出入度相等的點,而奇數點的不行,感性理解分類討論一下就知道是對的。還有乙個更好理解的結論是變成無向邊後奇數點的個數一定只有偶數個,因為有乙個奇數點就一定有另乙個跟他對應。那麼我們把奇數點湊成對連邊,這樣奇數點也變成了...