比赛 |
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;
}