nyoj 1239 引水工程 第八屆河南省程序設計大賽

引水工程

時間限制:2000 ms  |  內存限制:65535 KB
難度:3
描述

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

整個工程分東線、中線、西線三條調水線。東線工程位於東部,因地勢低需抽水北送至華北地區。中線工程從漢水與其最大支流丹江交匯處的丹江口水庫引水,自流供水給黃淮海平原大部分地區,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;
} 





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