一開始以為題很難,當我坐下來認真讀題後,卻神奇地發現這道題很水……
這和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個...