jzoj5895 旅遊 最小生成樹 尤拉迴路

2021-08-28 17:43:04 字數 1218 閱讀 5209

本來暈乎乎的看到可憐就瞬間清醒了

其實我們可以通過加邊使得條件由每條邊走至少一次變成每條邊走恰好一次。

注意到給出的邊非常特殊,可以發現所有有貢獻的邊都在最小生成樹上。如果n很小也可以考慮傳遞閉包做

考慮怎麼加邊,我們發現每次加邊會使兩端點度數的奇偶性發生變化。由於我們新增的實際上是一條路徑,那麼我們可以考慮一條邊在路徑中的貢獻。如果一條邊兩邊的奇點的數量都是奇數,那麼這條邊一定會算入答案

#include

#include

#include

#define rep(i,st,ed) for (int i=st;i<=ed;++i)

#define fill(x,t) memset(x,t,sizeof(x))

typedef

long

long ll;

const ll inf=

1000000000000000

;const

int mod=

998244353

;const

int n=

500005

;struct edge e[n*2]

;ll bin[n]

,ans;

int d[n]

,ls[n]

,fa[n]

,g[n]

,edcnt;

void

add_edge

(int x,

int y,

int w)

; ls[x]

=edcnt;

e[++edcnt]

=(edge)

; ls[y]

=edcnt;

}int

find

(int x)

void

dfs(

int now,

int from)

}int

main

(void

) ans=

(ans+bin[i]

)%mod;

}dfs(1

,0);

printf

("%lld\n"

, ans)

;return0;

}

JZOJ 最小生成樹 給水

由n塊草地組成了乙個花園 現在要你給這個花園裡的所有草地供水 你可以在第i ii塊草地挖井,費用為a i a i a i 也可以從其他草地連線水管過來 但前提是那個草地要有水,費用為f i j f i j f i j 現在要你求給所有草地供水 最少需要多少大洋 第一行,乙個n nn第2 22 n 1...

JZOJ 1244 修建道路 最小生成樹

傳送門 給出n nn個點和已經建好的m mm條邊,求我們需要修建的最小代價使得n nn個點可以互相到達 正常最小生成樹隨便跑,對於已經修好的邊就直接在開始就放在乙個塊裡 include include include include include include include include d...

JZOJ 1405 電纜建設 最小生成樹

傳送門 一共有n m n mn m個點,我們需要在連線長度最小的情況下使得所有點相連通 最顯然的方式肯定跑最小生成樹 但這樣的時間複雜度肯定是承擔不起的,所以我們要想點方法使得演算法更加優秀 考慮n nn個點中的乙個點與m mm個點中所有點的連線,因為題目要求的是最小長度,所以只有與這個點高度最相近...