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

2022-05-12 16:26:19 字數 1114 閱讀 6238

看到入度等於出度想到尤拉迴路。

我們把邊都變成無向邊,有乙個結論是偶數度的點都可以變成出入度相等的點,而奇數點的不行,感性理解分類討論一下就知道是對的。

還有乙個更好理解的結論是變成無向邊後奇數點的個數一定只有偶數個,因為有乙個奇數點就一定有另乙個跟他對應。

那麼我們把奇數點湊成對連邊,這樣奇數點也變成了偶數點。無向圖中所有的點的度數為偶數就存在尤拉迴路,於是我們就可以跑一遍尤拉迴路途中判斷邊是否需要返向來得到方案。

卡常題t t(其實是我寫太醜

#include#include

#include

#include

using

namespace

std;

const

int maxn=1000010

;struct poie[maxn<<1

];int

n,m,x,y,cnt,tot,cntt;

int d[maxn],p[maxn],last[maxn],flag[maxn<<1

],v[maxn];

char buf[80000010],*ptr=buf-1

;inline

intread()

return s*t;

}inline

void add(int x,int y,int z,int

from)

void dfs(intx)}

intmain()

for(register int i=1;i<=n;++i)if(d[i]&1)p[++cnt]=i;

for(register int i=1;i<=cnt;i+=2)add(p[i],p[i+1],(i>>1)+m+1,p[i]),add(p[i+1],p[i],(i>>1)+m+1

,p[i]);

for(register int i=1;i<=n;++i)if(!v[i])dfs(i);

printf(

"%d\n

",n-cnt);

for(int i=1;i<=m;i++)if(flag[i]==1)putchar('

0');else putchar('1'

);}

view code

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 考慮先當每條邊雙向。如果這個圖的所有點的度都是偶數,那麼尤拉路徑跑一下就行了 考慮度為奇數的點 連線所有度為奇數的點,使其成為偶數點,顯然不會影響正確性 留個坑...

1967 路徑定向

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