记录编号 251259 评测结果 AAAAAAAAAA
题目名称 [NOI 2006]最大获利 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 0.554 s
提交时间 2016-04-17 14:51:05 内存使用 12.02 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
//#include"debug.h"
using namespace std;

const int maxl=99999999;
int n,m,ans,s,t,cnt,p[5010],a[50010],b[50010],c[50010],i,j;
int head[60010],tail[60010],next[500010];
//1..n表示中转站,n+1..n+m表示用户群 
struct edge{
	int f,t,g,oppo;//oppo表示反向边地址 
}w[500010];
void add(int f,int t,int g){
	cnt++;w[cnt].f=f;w[cnt].t=t;w[cnt].g=g;w[cnt].oppo=cnt+1;
	if (head[f]==0) head[f]=tail[f]=cnt;
		else tail[f]=next[tail[f]]=cnt;
	cnt++;w[cnt].f=t;w[cnt].t=f;w[cnt].oppo=cnt-1;
	if (head[t]==0) head[t]=tail[t]=cnt;
		else tail[t]=next[tail[t]]=cnt;
}

int dui[60010],r,l[60010],top;
void bfs(){
	int i,j;
	dui[r=1]=s;l[s]=1;
	for (i=1;i<=t;i++) l[i]=-1;
	for (i=1;i<=r;i++){
		for (j=head[dui[i]];j!=0;j=next[j])
		if (w[j].g>0&&l[w[j].t]==-1){
			dui[++r]=w[j].t;l[w[j].t]=l[dui[i]]+1;
		}	
	}
}
struct stack{
	int x,i,df;
}z[60010];
void change(){
	int i,j=t,r,df=z[top].df;
	ans-=df;
	for (i=top-1;i>0;i--){
		w[z[i].i].g-=df;
		w[w[z[i].i].oppo].g+=df;
		z[i].df-=df;
		if (z[i].df==0) top=i;
	}
}
bool dinic(){
	bfs();
	if (l[t]==-1) return false;
	top=1;z[1].x=s;z[1].i=head[s];z[1].df=maxl;
	while (top>0){
		if (z[top].x==t){
			change();top--;z[top].i=next[z[top].i];continue;
		}
		if (z[top].i==0){
			l[z[top].x]=-1;top--;z[top].i=next[z[top].i];continue;
		}
		if (w[z[top].i].g>0&&l[w[z[top].i].t]==l[z[top].x]+1){
			z[top+1].x=w[z[top].i].t;
			z[top+1].df=min(z[top].df,w[z[top].i].g);
			top++;
			z[top].i=head[z[top].x];
			continue;
		}
		z[top].i=next[z[top].i];
	}
	return true;
}

int main()
{
	freopen("profit.in","r",stdin);
	freopen("profit.out","w",stdout);
	scanf("%d%d",&n,&m);
	s=0;t=n+m+1;
	for (i=1;i<=n;i++){
		scanf("%d",&p[i]);
		add(i,t,p[i]);
	}
	for (i=1;i<=m;i++){
		scanf("%d%d%d",&a[i],&b[i],&c[i]);
		ans+=c[i];
		add(s,n+i,c[i]);
		add(n+i,a[i],maxl);
		add(n+i,b[i],maxl);
	}
	/*for (i=s;i<=t;i++){
		writel(i);
		for (j=head[i];j!=0;j=next[j]) write(w[j].t);
		writeln;
	}*/
	while (dinic());
	printf("%d\n",ans);
	return 0;
}