比赛 20160415 评测结果 AAAAAAATTT
题目名称 能量网络 最终得分 70
用户昵称 前鬼后鬼的守护 运行时间 3.113 s
代码语言 C++ 内存使用 0.78 MiB
提交时间 2016-04-15 11:59:12
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<algorithm>
#define FILE "energynet"
typedef long long ll;
typedef double lf;
namespace IO{
	char buf[1<<15],*fs,*ft;
	inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
	inline int read(){
		int x=0,rev=0,ch=getc();
		while(ch<'0'||ch>'9'){if(ch=='-')rev=1;ch=getc();}
		while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getc();}
		return rev?-x:x;
	}
}using namespace IO;
const int MAXN(1000),MAXM(50000),D(20),INF(1<<30);
struct edge{
	int y,next;
	static int tot;
}e[MAXM*2+D];
int head[MAXN*2+D],edge::tot;
inline void connect(int x,int y){
	int& k=edge::tot;
	e[++k].next=head[x];e[head[x]=k].y=y;
	e[++k].next=head[y];e[head[y]=k].y=x;
}
int n,m,a[MAXN+D],b[MAXN+D],ans=INF;
int p[MAXN+D];
inline bool cmp(int x,int y){return a[x]>a[y];}
void init(){
	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++){
		int x=read(),y=read();
		connect(x,n+y);
	}
	for(int i=1;i<=n;i++)
		p[i]=i;
	std::sort(p+1,p+n+1,cmp);
}
int con[MAXN+D];
void dfs(int now,int sum){
	if(sum>ans)return;
	if(now==n+1){ans=sum;return;}
	int k=p[now];
	dfs(now+1,sum+b[k]);
	int temp=0;
	for(int i=head[n+k],y;i;i=e[i].next)
		if(!con[y=e[i].y]){
			con[y]=now;
			temp+=a[k];
		}
	dfs(now+1,sum+temp);
	for(int i=head[n+k],y;i;i=e[i].next)
		if(con[y=e[i].y]==now)
			con[y]=0;
}
int main(){
	freopen(FILE".in","r",stdin);
	freopen(FILE".out","w",stdout);
	init();
	dfs(1,0);
	printf("%d\n",ans);
	return 0;
}