灌溉 (圖論+最小生成樹+並查集)

到了旱季農業生產的灌溉就成了一個大問題。爲了保證灌溉的順利,某縣政府決定投資爲各個村之間建立灌溉管道。

輸入第1行包括一個整數N,表示某縣的村莊的數量。(3≤N≤100),第2行-結尾爲一個N×N的矩陣,表示每個村莊之間的距離。雖然在理論上,他們是N行,每行由N個用空格分隔的數組成,實際上,他們限制在80個字符,因此,某些行會緊接着另一些行。當然,對角線將會是0,因爲不會有線路從第i個村到它本身(任何兩個村之間的距離都不大於100000)。

輸出只有一個,爲修建灌溉管道將所有村莊相連在一個灌溉系統裏所需的最小管道長度。

樣例輸入複製

4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0

樣例輸出複製

28

題解:也是裸的最小生成樹。題目不同在於直接給出了圖,動點腦筋想想怎麼存數據。

代碼:

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 105;
int Tree[maxn];
struct city
{
    int u;
    int v;
    int cost;
} c[10005];  //注意100*100
bool cmp(city a,city b)
{
    return a.cost<b.cost;
}
int findRoot(int x)
{
    if(Tree[x]==-1)
        return x;
    else
    {
        int tmp=findRoot(Tree[x]);
        Tree[x]=tmp;
        return tmp;
    }
}
int main()
{
    int n;
    cin>>n;
    int tmp;
    for(int i=0; i<n; i++)
        Tree[i]=-1;
    int sum=0;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            cin>>tmp;
            if(i!=j)
            {
                c[sum].u=i;
                c[sum].v=j;
                c[sum].cost=tmp;
                sum++;
            }

        }
    }
    sort(c,c+sum,cmp);
    int ans=0;
    for(int i=0; i<sum; i++)
    {
        int aa=findRoot(c[i].u);
        int bb=findRoot(c[i].v);
        if(aa!=bb)
        {
            Tree[aa]=bb;
            ans+=c[i].cost;
        }
    }
    printf("%d\n",ans);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章