比赛 |
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;
}