第八屆河南省程序設計大賽D引水工程(最小生成樹)

題目描述
南水北調工程是優化水資源配置、促進區域協調發展的基礎性工程,是新中國成立以來投資額最大、涉及面最廣的戰略性工程,事關中華民族長遠發展。“南水北調工程”,旨在緩解中國華北和西北地區水資源短缺的國家戰略性工程。就是把中國長江流域豐盈的水資源抽調一部分送到華北和西北地區。我國南澇北旱,南水北調工程通過跨流域的水資源合理配置,促進南北方經濟、社會與人口、資源、環境的協調發展。

整個工程分東線、中線、西線三條調水線。東線工程位於東部,因地勢低需抽水北送至華北地區。中線工程從漢水與其最大支流丹江交匯處的丹江口水庫引水,自流供水給黃淮海平原大部分地區,20多座大中城市;西線工程在青藏高原上,由長江上游向黃河上游補水。

現在有N個區域需要建設水資源工程,它們可以自建水庫解決缺水問題,也可以從已有水源的地區建立管道引水過來。當然,這些建設都需要大量投資。

你能不能給出一個優化水資源配置方案,在保證每個區域都能用上水的前提下,使得整個引水工程費用最低。

輸入
第一行: K 表示有多少組測試數據。 接下來對每組測試數據: 第1行: N 表示有N個區域( 1<=N<=300 ) 第2 行: W1 W2 …. WN Wi表示第i個區域自建水庫需要的費用 再有N行: Pi1 Pi2 …. Pin Pij表示建立第i個區域與第j個區域引水管道的費用
輸出
對於每組測試數據,輸出佔一行,即建立整個引水工程的最小費用。
樣例輸入
1
5
5 4 4 3 6
0 2 2 2 2
2 0 3 3 3
2 3 0 4 5
2 3 4 0 1
2 3 5 1 0
樣例輸出
10
這個題需要在最小生成樹的模板上修改一下,因爲建立水資源有可能比最小生成樹的邊要小,所以要比較兩者的大小,選花費最小的
代碼如下

#include<iostream>
#include<algorithm>
#include<string>
#include<stdio.h>
#include<string.h>
using namespace std;
const int N=300+10, inf=0x3f3f3f3f;
int a[N][N],dis[N],b[N],t,n,p[N];
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        int sum=1,s=0,i,j,mix=inf,k;
        scanf("%d",&n);
        for(i=1; i<=n; i++)
        {
            scanf("%d",&p[i]);
            if(mix>p[i])
            {
                mix=p[i];
                k=i;
            }
        }
        for(i=1; i<=n; i++)
            for( j=1; j<=n; j++)
                scanf("%d",&a[i][j]);
        memset(b,0,sizeof(b));
        for(i=1; i<=n; i++) dis[i]=a[k][i];
        dis[k]=0, b[k]=1 ;
        while(sum<n)
        {
            int minn=inf, u;
            for(i=1; i<=n; i++)
                if(!b[i]&&minn>dis[i]) minn=dis[i], u=i;
            b[u]=1, sum++, s+=min(dis[u],p[u]);
            for(i=1; i<=n; i++)
                if(!b[i]&&a[u][i]<dis[i]) dis[i]=a[u][i];
        }
        printf("%d\n",mix+s);
    }
}


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