比赛 2008haoi模拟训练1 评测结果 WWWWWWWWWW
题目名称 最大获利 最终得分 0
用户昵称 zqzas 运行时间 0.191 s
代码语言 C++ 内存使用 195.95 MiB
提交时间 2008-04-22 11:08:45
显示代码纯文本
#include <stdio.h>

#define maxn 5010
#define inf 30000

int n,m,s[maxn],gujia[maxn],hash[maxn],data[maxn][maxn],map[maxn][maxn];
long ans;
FILE *f1,*f2;

int compute(void)
{
	int i,j,y,max;
	max=5001;
	gujia[max]=-inf;
	for (i=1;i<=n;i++)
	{
		if (hash[i])
			continue;
		gujia[i]=-s[i];
		for (j=1;j<=map[i][0];j++)
		{
			y=map[i][j];
			if (hash[y])
			{
				gujia[i]+=data[i][y];
			}
		}
		if (gujia[i]>gujia[max])
			max=i;
	}
	return max;
}

void run(void)
{
	int max,flag;
	do
	{
		max=compute();		
		if (gujia[max]<=0)
		{
			flag=0;
		}
		else
		{
			flag=1;
			hash[max]=1;
			ans+=gujia[max];
		}

	}while (flag);

}

void ini(void)
{
	int i,max,a,b,c;
	fscanf(f1,"%d%d",&n,&m);
	for (i=1;i<=n;i++)
		fscanf(f1,"%d",&s[i]);
	for (i=1;i<=m;i++)
	{
		fscanf(f1,"%d%d%d",&a,&b,&c);
		data[a][b]=c;
		data[b][a]=c;
		map[a][++map[a][0]]=b;
		map[b][++map[b][0]]=a;
	}
	max=5001;
	map[max][0]=0;
	s[maxn]=inf;
	for (i=1;i<=n;i++)
	{
		if (map[i][0]==map[max][0] && s[i]<s[max])
			max=i;
		if (map[i][0]>map[max][0])
			max=i;
	}
	hash[max]=1;
	ans=-s[max];
	//pay+=s[max];
}

int main(void)
{
	f1=fopen("profit.in","r");
	f2=fopen("profit.out","w");
	ini();
	run();
	fprintf(f2,"%ld\n",ans);
	fclose(f1);fclose(f2);
	return 0;
}