记录编号 412108 评测结果 AAAAAAAAAA
题目名称 [NOI 2006]最大获利 最终得分 100
用户昵称 Gravatarxyz117 是否通过 通过
代码语言 C++ 运行时间 0.079 s
提交时间 2017-06-07 20:24:43 内存使用 0.90 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF=0x7ffffff;
const int maxm=310001;
const int maxn=56001;
struct node
{
	int v,f,nex;
}edge[maxm];
int head[maxn];
int q[maxn],ans,sum;
int le[maxn],tot=-1,n,m;
void add(int u,int v,int f)
{
	edge[++tot]=(node){v,f,head[u]};
	head[u]=tot;
	edge[++tot]=(node){u,0,head[v]};
	head[v]=tot;
}
bool bfs(int s,int t)
{
	memset(le,0,sizeof(le));
	le[s]=1;
	int fr=0,ta=1,x,i,v,f;
	q[fr]=s;
	while(fr<ta)
	{
		x=q[fr++];
		if(x==t)
			return true;
		for(i=head[x];i!=-1;i=edge[i].nex)
		{
			v=edge[i].v;
			f=edge[i].f;
			if(!le[v]&&f)
			{
				le[v]=le[x]+1;
				q[ta++]=v;
			}
		}
	}
	return false;
}
int dfs(int u,int maxf,int t)
{
	if(u==t)
		return maxf;
	int M,ret=0,v,f,i;
	for(i=head[u];i!=-1;i=edge[i].nex)
	{
		v=edge[i].v;
		f=edge[i].f;
		if(le[u]+1==le[v]&&f)
		{
			M=min(maxf-ret,f);
			f=dfs(v,M,t);
			edge[i].f-=f;
			edge[i^1].f+=f;
			ret+=f;
			if(ret==maxf)
				return ret;
		}
	}
	return ret;
}
int dinic(int s,int t)
{
	ans=0;
	while(bfs(s,t))
		ans+=dfs(s,INF,t);
	printf("%d",sum-ans);
}
int haha()
{
	freopen("profit.in","r",stdin);
	freopen("profit.out","w",stdout);
	int x,y,z;
	scanf("%d%d",&n,&m);
	memset(head,-1,sizeof(head));
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&x);
		add(0,i,x);
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		
		add(x,n+i,INF);
		add(y,n+i,INF);
		add(n+i,n+m+1,z);
		sum+=z;
	}
	dinic(0,n+m+1);
	return 0;
}
int sb=haha();
int main()
{;}