BZOJ1232: [Usaco2008Nov]安慰奶牛cheer 最小生成樹 Kruskal

Description

Farmer John變得非常懶, 他不想再繼續維護供奶牛之間供通行的道路. 道路被用來連接N (5 <= N <= 10,000)個牧場, 牧場被連續地編號爲1..N. 每一個牧場都是一個奶牛的家. FJ計劃除去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)的時間和奶牛交談. 你每個晚上都會在同一個牧場(這是供你選擇的)過夜, 直到奶牛們都從悲傷中緩過神來. 在早上起來和晚上回去睡覺的時候, 你都需要和在你睡覺的牧場的奶牛交談一次. 這樣你才能完成你的交談任務. 假設Farmer John採納了你的建議, 請計算出使所有奶牛都被安慰的最少時間. 對於你前10次的提交, 你的程序會在一部分正式的測試數據上運行, 並且返回運行的結果.

Input

  • 第 1 行: 用空格隔開的兩個整數N和P * 第 2..N+1 行: 第i+1行包含了一個整數: C_i * 第 N+2..N+P+1 行: 第 N+j+1 行包含用空格隔開的三個整數: S_j, E_j 和 L_j

Output

第 1 行: 一個整數, 所需要的總時間(包含和在你所在的牧場的奶牛的兩次談話時間).

Sample Input

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

Sample Output

176
HINT

**題解:
因爲經過路徑的話對於每條邊來說,如果走過去的話必然會走回來,而且要經過(加上)兩個端點的權值,進行最小生成樹之後再在所有點權值中選一個最小的當做起點加入。**

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN=1000001;
const int INF=0x7fffffff;
struct xx
{
    int u,v,w;
}e[MAXN];
int father[MAXN],cnt,n,E;int tot;
int c[MAXN];
bool cmp(xx a,xx b)
{
    return a.w<b.w;
}
int find(int x)
{
    if(x==father[x]) return x;
    father[x]=find(father[x]);
    return father[x];
}
void Kruskal()
{
    int i=1;
    while(i<=E&&cnt<n)
    {
        int a=find(e[i].u);
        int b=find(e[i].v);
        if(a!=b) {
            father[a]=b;
            tot+=e[i].w;
            cnt++;
        }
        i++;
    }
}
int main(int argc, char *argv[])
{
    int i;
    int mini=INF;
    scanf("%d%d",&n,&E);
    for(i=1;i<=n;i++) father[i]=i;
    for(i=1;i<=n;i++) scanf("%d",&c[i]),mini=min(mini,c[i]);
    tot+=mini;
    for(i=1;i<=E;i++) {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        z=z*2+c[x]+c[y];
        e[i].u=x,e[i].v=y;e[i].w=z;
    }
    sort(e+1,e+E+1,cmp);
    Kruskal();
    printf("%d\n",tot);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章