比赛 20160415 评测结果 AAAWWWWWWW
题目名称 能量网络 最终得分 30
用户昵称 lxtgogogo 运行时间 0.102 s
代码语言 C++ 内存使用 3.80 MiB
提交时间 2016-04-15 10:59:44
显示代码纯文本
/*
Language: c++
Author: lxtgogogo
Date: 2016.04.15
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<queue>
using namespace std;
inline int read(){
	int x=0;bool f=true;char ch=getchar();
	while(ch>'9' || ch<'0')	{if(ch=='-'){f=false;}ch=getchar();}
	while(ch>='0' && ch<='9')	{x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	return f?x:-x;
}
const int r=1010;
const int rr=50010;
int n=0,m=0,ans=0;
int A[r]={},B[r]={};
int bian[r][r]={};
bool f[r]={};

inline int max(int a,int b){if(a>b){return a;}return b;}
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();
		bian[x][++bian[x][0]]=y;
	}
	for(int i=1;i<=n;i++)//最初的answer
	{
		int maxx=0;
		for(int j=1;j<=bian[i][0];j++)
			maxx=max(maxx,A[bian[i][j]]);
		ans+=maxx;
	}
}
void dfs(int i,int cost){
	if(i==n+1)
	{
		for(int i=1;i<=n;i++)
		{
			int maxx=0;
			for(int j=1;j<=bian[i][0];j++)
				maxx=max(maxx,f[bian[i][j]]?0:A[bian[i][j]]);
			cost+=maxx;
		}
		if(cost<ans)	ans=cost;
		return ;
	}
	if(cost>ans)	return ;
	f[i]=true;
	dfs(i+1,cost+B[i]);
	f[i]=false;
	dfs(i+1,cost);
}
void work1(){//来让我们花五分钟写个骗分......
	int temp=0;
	for(int i=1;i<=n;i++)
	{
		int maxx=0,c=0;
		for(int j=1;j<=bian[i][0];j++)
			if(A[bian[i][j]]>maxx)
			{
				maxx=A[bian[i][j]];
				c=bian[i][j];
			}
		if(B[c]<A[c])
		{
			if(!f[c])	f[c]=true;
			maxx=B[c];
		}
		temp+=maxx;
	}
	ans=min(ans,temp);
	printf("%d\n",ans);
}
int main(){
	freopen("energynet.in","r",stdin);
	freopen("energynet.out","w",stdout);
	
	init();
	if(n<=20)	{dfs(1,0);printf("%d\n",ans);}
	else	work1();
	
	fclose(stdin);fclose(stdout);
	return 0;
}