记录编号 250727 评测结果 AAAAAAAAAA
题目名称 能量网络 最终得分 100
用户昵称 GravatarSatoshi 是否通过 通过
代码语言 C++ 运行时间 1.354 s
提交时间 2016-04-15 19:34:17 内存使用 1.35 MiB
显示代码纯文本
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#define M 1010
#define N 51000 
using namespace std;
ifstream in("energynet.in");
ofstream out("energynet.out");
int INF=(1<<28);
int A[M]={0};
int B[M]={0};
vector<int> F[M];
int n,m;
int S,T;
class edge
{
public:
	int u,v,w,cap,flow;
	void make(int a,int b,int c,int d,int e)
	{
		u=a;v=b;w=c;cap=d;flow=e;
	}
	void print()
	{
		out<<u<<' '<<v<<' '<<w<<' '<<cap<<' '<<flow<<endl;
	}
};
class Dinic
{
public:
	vector<edge> E;
	vector<int> G[N];
	bool vis[N];
	int cur[N],h[N];
	int size,flows;
	void clear(int siz)
	{
		int i;
		size=siz+1;
		E.clear();
		for(i=0;i<=size;i++)G[i].clear();
		memset(cur,0,sizeof(cur));
		memset(h,0,sizeof(h));
		memset(vis,0,sizeof(vis));
	}
	void add(int u,int v,int cap)
	{
		edge e;
		e.make(u,v,0,cap,0);
		//e.print();
		E.push_back(e);
		e.make(v,u,0,0,0);
		E.push_back(e);
		int o=E.size();
		G[u].push_back(o-2);
		G[v].push_back(o-1);
	}
	bool DinicBFS(int s,int t)
	{
		int i,u,v;
		queue<int> q;
		memset(vis,0,sizeof(vis));
		memset(h,0,sizeof(h));
		q.push(s);
		vis[s]=1;
		while(!q.empty())
		{
			u=q.front();
			q.pop();
			for(i=0;i<G[u].size();i++)
			{
				edge e=E[G[u][i]];
				v=e.v;
				if(!vis[v]&&e.cap>e.flow)
				{
					vis[v]=1;
					h[v]=h[u]+1;
					q.push(v);
				}
			}
		}
		return vis[t];
	}
	int DinicDFS(int u,int a,int t)
	{
		if(u==t||a<=0)return a;
		int flow=0,d,v;
		for(int &i=cur[u];i<G[u].size();i++)
		{
			edge &e=E[G[u][i]];
			v=e.v;
			if(h[v]==h[u]+1&&e.cap>e.flow)
			{
				d=DinicDFS(v,min(a,e.cap-e.flow),t);
				e.flow+=d;
				E[G[u][i]^1].flow-=d;
				flow+=d;
				a-=d;
			}
			if(a<=0)break;
		}
		return flow;
	}
	int maxflow(int s,int t)
	{
		int flow=0,temp;
		while(DinicBFS(s,t))
		{
			memset(cur,0,sizeof(cur));
			temp=DinicDFS(s,INF,t);
			flow+=temp;
		}
		flows=flow;
		return flow;
	}
}D;
bool com(int a,int b)
{
	return A[a]>A[b];
}
void read()
{
	int i,u,v;
	in>>n>>m;
    for(i=1;i<=n;i++)in>>A[i];
	for(i=1;i<=n;i++)in>>B[i];
	for(i=1;i<=m;i++)
	{
		in>>u>>v;
		F[u].push_back(v);
	}
}
void buildgraph()
{
	int i,j,v,col;
	S=0;col=n;
	T=m+100;
	D.clear(T);
	for(i=1;i<=n;i++)
	{
		sort(F[i].begin(),F[i].end(),com);
		D.add(S,i,B[i]);
		for(j=0;j<F[i].size();j++)
		{
			v=F[i][j];
			col++;
			D.add(v,col,INF);
			if(j!=F[i].size()-1)D.add(col,T,A[v]-A[F[i][j+1]]);
			else D.add(col,T,A[v]);
			if(j)D.add(col-1,col,INF);
		}
	}
}
void work()
{
	int ans;
	ans=D.maxflow(S,T);
	out<<ans<<endl;
}
int main()
{
	read();
	buildgraph();
	work();
	return 0;
}