最小生成樹 安慰員工

2021-06-10 04:55:30 字數 1892 閱讀 4245

安慰員工(cheer.pas/c/cpp) 

【題目描述】 

longdd 變得非常懶, 他不想再繼續維護供員工之間供通行的道路. 道路被用來連

接n(5 <= n <= 10,000)個房子, 房子被連續地編號為 1..n. 每乙個房子都是乙個

員工的家. longdd計畫除去 p(n-1 <= p <= 100,000)條道路中盡可能多的道路, 但

是還要保持房子之間的連通性. 你首先要決定那些道路是需要保留的 n-1 條道路. 

第j條雙向道路連線了房子 s_j和e_j (1 <= s_j <= n; 1 <= e_j <= n; s_j != e_j),

而且走完它需要l_j (0 <= l_j <= 1,000)的時間.沒有兩個房子是被一條以上的道

路所連線. 

員工們非常傷心, 因為她們的交通系統被削減了. 你需要到每乙個員工的住處去安

慰她們. 每次你到達第 i 個房子的時候(即使你已經到過), 你必須花去 c_i (1 <= 

c_i <= 1,000)的時間和員工交談. 

你需要從某乙個房子出發(這是供你選擇的),並最終回到這個房子。期間,你要經

過每個房子至少一次,並且當你經過某個房子的時候,你必須和這個房子裡的員工

交談(即使你已經到過). 

假設longdd 採納了你的建議, 請計算出使所有員工都被安慰的最少時間. 

【輸入格式】 

* 第 1 行: 用空格隔開的兩個整數 n和p 

* 第 2..n+1 行: 第i+1 行包含了乙個整數: c_i 

* 第 n+2..n+p+1 行: 第 n+j+1 行包含用空格隔開的三個整數: s_j, e_j 和 l_j 

【輸入樣例】 

5 7 

10 10 

20 6 

30 1 2 5 

2 3 5 

2 4 12 

3 4 17 

2 5 15 

3 5 6 

4 5 12 

這道題比較水但是當時出現了特別奇葩的錯誤

教訓:記得判斷邊界(無論你如何相信不會超出邊界 但很有可能他還是會超出邊界)

裸的最小生成樹吧

由於去掉邊後形成的是乙個有迴路的樹

每條邊必然被使用兩次

所以邊權值為二倍長度 + 兩端點的代價

而出發點並沒有計算在內 所以最後加上出發點的代價

也就是所有代價中最小的乙個

**如下

#include #include #include #include using namespace std;

int n, p;

int cost[100005];

int father[100005];

int low = 0x3f3f3f3f;

int mst();

void init();

int get_father(int x);

int ans;

struct edge

}edge[1000005];

inline void ins(int k)

void init()

return;

}inline int get_father(int x)

return x;

}void init_file()

void read_data()

for(int i = 1; i <= p; i++)

ins(i);

sort(edge + 1, edge + 1 + p);

}int mst()

++time;

}return ans;

}void work()

int main()

安慰奶牛 最小生成樹

題目 渣渣oj 題幹 問題描述 farmer john變得非常懶,他不想再繼續維護供奶牛之間供通行的道路。道路被用來連線n個牧場,牧場被連續地編號為1到n。每乙個牧場都是乙個奶牛的家。fj計畫除去p條道路中盡可能多的道路,但是還要保持牧場之間 的連通性。你首先要決定那些道路是需要保留的n 1條道路。...

安慰奶牛 最小生成樹MST

時間限制 1.0s 記憶體限制 256.0mb 問題描述 farmer john變得非常懶,他不想再繼續維護供奶牛之間供通行的道路。道路被用來連線n個牧場,牧場被連續地編號為1到n。每乙個牧場都是乙個奶牛的家。fj計畫除去p條道路中盡可能多的道路,但是還要保持牧場之間 的連通性。你首先要決定那些道路...

藍橋杯 安慰奶牛 最小生成樹

問題描述 farmer john變得非常懶,他不想再繼續維護供奶牛之間供通行的道路。道路被用來連線n個牧場,牧場被連續地編號為1到n。每乙個牧場都是乙個奶牛的家。fj計畫除去p條道路中盡可能多的道路,但是還要保持牧場之間 的連通性。你首先要決定那些道路是需要保留的n 1條道路。第j條雙向道路連線了牧...