引水工程
- 描述
-
南水北調工程是優化水資源配置、促進區域協調發展的基礎性工程,是新中國成立以來投資額最大、涉及面最廣的戰略性工程,事關中華民族長遠發展。“南水北調工程”,旨在緩解中國華北和西北地區水資源短缺的國家戰略性工程。就是把中國長江流域豐盈的水資源抽調一部分送到華北和西北地區。我國南澇北旱,南水北調工程通過跨流域的水資源合理配置,促進南北方經濟、社會與人口、資源、環境的協調發展。
整個工程分東線、中線、西線三條調水線。東線工程位於東部,因地勢低需抽水北送至華北地區。中線工程從漢水與其最大支流丹江交匯處的丹江口水庫引水,自流供水給黃淮海平原大部分地區,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<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INF 1000000
#define MAXN 305
int n,m;
int Edge[MAXN][MAXN];
int lowcost[MAXN];
int nearvex[MAXN];
int sumweight;
int num[305];
void prim(int u0)
{
sumweight=0;
int i,j;
memset(nearvex,0,sizeof(nearvex));
for(i=1;i<=n;i++)
{
lowcost[i]=Edge[u0][i];
}
//memset(lowcost,0x3f,sizeof(lowcost));
nearvex[u0]=1;
for(i=1;i<n;i++)
{
int min=INF;
int v=-1;
for(j=1;j<=n;j++)
{
if(!nearvex[j]&&lowcost[j]<min)
{
v=j;
min=lowcost[j];
}
}
nearvex[v]=1;
//printf("%d->%d lowcost[v]%d num[v]%d\n",nearvex[v],v,lowcost[v],num[v]);
//printf("%d %d %d\n",nearvex[v],v,lowcost[v]);
//nearvex[v]=-1;
if(min>num[v]) sumweight+=num[v];
else sumweight+=min;
for(j=1;j<=n;j++)
{
if(!nearvex[j]&&Edge[v][j]<lowcost[j])
{
lowcost[j]=Edge[v][j];
//nearvex[j]=v;
}
}
}
}
int main()
{
int i,j;
int u,v,w;
int k,f,mi=INF;
scanf("%d",&k);
while(k--)
{
mi=INF;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&num[i]);
if(mi>num[i])
{
mi=num[i];
f=i;
}
}
//printf("%d %d\n",mi,f);
memset(Edge,0,sizeof(Edge));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&Edge[i][j]);
}
}
prim(f);
printf("%d\n",sumweight+num[f]);
}
return 0;
}