记录编号 251022 评测结果 AAAAAAAAAA
题目名称 能量网络 最终得分 100
用户昵称 Gravatardydxh 是否通过 通过
代码语言 C++ 运行时间 0.619 s
提交时间 2016-04-16 17:31:22 内存使用 4.79 MiB
显示代码纯文本
/*
Problem:Energynet;
Language:c++;
by dydxh;
Date:2016.04.16;
*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<utility>
#include<cstdlib>
#include<cstdio>
#include<string>
#include<vector>
#include<ctime>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define ull unsigned long long
using namespace std;
const int oo=2000000000;
const int maxn=1005;
const int maxm=50005;
typedef pair<int,int> Pii;
int n,m,Len=1,Cnt,Super_s,Super_e;
int A[maxn],B[maxn],Linkk[maxn+maxm];
Pii E[maxm];
struct edge{
	int y,next,v;
}e[(maxm+maxn)*6];
inline int read(){
	int x=0;bool flag=false;char ch=getchar();
	while(ch>'9' || ch<'0'){if(ch=='-') flag=true;ch=getchar();}
	while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return flag?-x:x;
}
void Insert(int a,int b,int c){
	e[++Len].next=Linkk[a],Linkk[a]=Len,e[Len].y=b,e[Len].v=c;
	e[++Len].next=Linkk[b],Linkk[b]=Len,e[Len].y=a,e[Len].v=0;
	//printf("%d->%d %d\n",a,b,c);
}
bool mycmp(Pii a,Pii b){
	return ((a.first<b.first) || a.first==b.first && A[a.second]<A[b.second]);
}
void Initialize(){
	n=read(),m=read();
	for(int i=1;i<=n;i++) A[i]=read();
	for(int i=1;i<=n;i++) B[i]=read();
	for(int i=1;i<=m;i++) E[i].first=read(),E[i].second=read();
	sort(E+1,E+1+m,mycmp);
	int Tot=0;
	for(int i=1;i<=m;i++){
		if(E[i].first==E[i-1].first && E[i].second==E[i-1].second) continue;
		E[++Tot]=E[i];
	}
	m=Tot;
}
void Build_Graph(){
	Super_s=0,Super_e=n+1,Cnt=n+1;
	for(int i=1,Last=1;i<=m;i=Last+1,Last=i){
		while(Last<m && E[Last].first==E[Last+1].first) Last++;
		for(int j=i;j<=Last;j++){
			++Cnt;
			if(j!=i){
				Insert(Cnt-1,Cnt,oo);
				Insert(Super_s,Cnt,A[E[j].second]-A[E[j-1].second]);
			}
			else Insert(Super_s,Cnt,A[E[i].second]);
			Insert(Cnt,E[j].second,oo);
		}
	}
	for(int i=1;i<=n;i++) Insert(i,Super_e,B[i]);
}
int Head,Tail;
int Q[maxn+maxm],Level[maxn+maxm];
bool Make_Level(){
	memset(Level,-1,sizeof(Level));
	Level[Super_s]=0,Q[Tail=1]=Super_s,Head=0;
	while(Head<Tail){
		int Tn=Q[++Head];
		for(int i=Linkk[Tn];i;i=e[i].next){
			int Tmp=e[i].y;
			if(Level[Tmp]!=-1 || e[i].v==0) continue;
			Level[Tmp]=Level[Tn]+1,Q[++Tail]=Tmp;
		}
	}
	return Level[Super_e]!=-1;
}
inline int min(const int &a,const int &b){return a<b?a:b;}
int Dfs(int x,int Flow){
	if(x==Super_e) return Flow;
	int D=0,Maxx=0;
	for(int i=Linkk[x];i && Maxx<Flow;i=e[i].next){
		int Tn=e[i].y;
		if(Level[Tn]!=Level[x]+1 || e[i].v==0) continue;
		D=Dfs(Tn,min(e[i].v,Flow-Maxx));
		if(D) e[i].v-=D,e[i^1].v+=D,Maxx+=D;
	}
	if(Maxx==0) Level[x]=-1;
	return Maxx;
}
int Dinic(){
	int Final=0;
	while(Make_Level())
		Final+=Dfs(Super_s,oo);
	return Final;
}
int main(){
	//freopen("cc.in","r",stdin);
	freopen("energynet.in","r",stdin);
	freopen("energynet.out","w",stdout);
	Initialize();
	Build_Graph();
	cout<<Dinic()<<endl;
	//cout<<"Time has passed:"<<1.0*clock()/1000<<"s!"<<endl;
    return 0;
}