APIO2008 免費道路

2022-03-27 06:53:26 字數 1043 閱讀 2525

\(kruskal\)好題

\(0\)邊的數量在某些情況下是可以無限制的調控的,前提是所有必須存在的邊都在生成樹里了

所以應該分別求出有哪些邊是必須在生成樹里的,我們可以先從大到小排序,求出有哪些\(0\)邊必須在生成樹里,之後再從小到大排序,求出那些\(1\)邊必須在生成樹里

之後剩下的邊就可以隨便放了,調控\(0\)邊的個數恰好為\(k\)即可

**

#include#include#include#include#define ll long long

#define re register

#define maxn 20005

struct e

e[100005],ans[100005];

inline int read()

int fa[maxn],sz[maxn];

int n,m,tot,k,num;

inline void rebuild()

int find(int x)

inline int merge(int x,int y)

inline int cmp1(e a,e b)

int main()

std::sort(e+1,e+m+1,cmp1);

rebuild();

for(re int i=1;i<=m;i++)

if(merge(e[i].u,e[i].v)&&e[i].w)

ans[++tot].u=e[i].u,ans[tot].v=e[i].v,ans[tot].w=1;

rebuild();

for(re int i=1;i<=tot;i++)

merge(ans[i].u,ans[i].v);

for(re int i=1;i<=m;i++) }

if(tot!=n-1||numelse for(re int i=1;i<=tot;i++) printf("%d %d %d\n",ans[i].u,ans[i].v,ans[i].w);

return 0;

}

APIO2008 免費道路

bzoj luogu 先把必須連的鵝卵石路連上,大於k條no solution 什麼樣的鵝卵石路 u,v 必須連?所有水泥路都連上仍然不能使u,v連通的必須連 補全到k條鵝卵石路,補不全no solution 最後用水泥路構出生成樹,構不出no solution includeusing names...

APIO2008 免費道路 生成樹

新亞 new asia 王國有 n 個村莊,由 m 條道路連線。其中一些道路是鵝卵石路,而其它道路是水泥路。保持道路免費執行需要一大筆費用,並且看上去 王國不可能保持所有道路免費。為此亟待制定乙個新的道路維護計畫。國王已決定保持盡可能少的道路免費,但是兩個不同的村莊之間都應該一條且僅由一條 且僅由一...

APIO2008 免費道路 克魯斯卡爾專精

題面 給定一張n個點m條邊的無向圖 不保證聯通 其中圖上每個邊都有顏色 黑白 現在要構造一棵生成樹,使樹上黑邊數量等於k,如果不存在合法的構造方案,輸出 no solution k 2 10 4k k2 104m 10 5m le10 5 m 105題解 首先考慮什麼時候會no solotion 圖...