P2700 逐個擊破

2022-05-24 07:15:11 字數 1083 閱讀 4582

一開始以為題很難,當我坐下來認真讀題後,卻神奇地發現這道題很水……

這和kruskal有什麼區別啊?

於是我開開心心地十五分種敲完了**~

然後我就wa了……

emmm……

尷尬……

一開始我對於每乙個點的no值都進行維護,時間複雜度特別高,於是就wa了qwq

後來我發現,其實一顆樹只要維護乙個no,即根結點的no即可,這樣判斷這棵樹數是否包含那k個城市的時候。只要看根節點就可以了。

那麼對於樹的相連,看哪一棵樹的根節點有no,就繼續作為根節點;如果都沒有,直接加邊就可以,如果都有,這條邊就不能連啦~

簡單地總結一下,先貪心排序,再正常連邊,判斷是否能連,一訪問到no就直接將其作為根結點,便於以後的訪問。

還有,開long long(別問我是怎麼知道的)……

其實寫**的時候注意到有關no轉移的技巧,這就是一道提高減的題,根本沒什麼難度。

上**:

#include#include

#include

using

namespace

std;

#define maxn 100005

#define int long long

struct

data

q[maxn];

intn,k,sum,par[maxn];

bool

no[maxn],flag;

bool

cmp(data a,data b)

int find(int

x)main()

for(int i=0; i1; i++)

sort(q,q+n-1

,cmp);

for(int i=0; i1; i++)

int nx=find(q[i].x);

int ny=find(q[i].y);

if(no[ny])

par[nx]=ny;

else

par[ny]=nx;

}printf(

"%lld

",sum);

return0;

}

題解 逐個擊破 luogu2700

現在有n個城市,其中k個被敵方軍團占領了,n個城市間有n 1條公路相連,破壞其中某條公路的代價是已知的。現在,告訴你k個敵方軍團所在的城市,以及所有公路破壞的代價,請你算出花費最少的代價將這k個地方軍團互相隔離開,以便第二步逐個擊破敵人。第一行包含兩個正整數n和k。第二行包含k個整數,表示哪個城市別...

P1008 三連擊(洛谷)

本題為提交答案題,您可以寫程式或手算在本機上算出答案後,直接提交答案文字,也可提交答案生成程式。將1,2,cdots 91,2,9共99個數分成33組,分別組成33個三位數,且使這33個三位數構成1 2 31 2 3的比例,試求出所有滿足條件的33個三位數。輸入格式 木有輸入 輸出格式 若干行,每行...

洛谷P1008 三連擊

題目背景 本題為提交答案題,您可以寫程式或手算在本機上算出答案後,直接提交答案文字,也可提交答案生成程式。題目描述 將1,2,9共9個數分成333組,分別組成3個三位數,且使這3個三位數構成1 2 3的比例,試求出所有滿足條件的3個三位數。輸入輸出格式 輸入格式 木有輸入 輸出格式 若干行,每行3個...