比赛 |
20160415 |
评测结果 |
AAAWWWWWWW |
题目名称 |
能量网络 |
最终得分 |
30 |
用户昵称 |
debug |
运行时间 |
0.443 s |
代码语言 |
C++ |
内存使用 |
0.95 MiB |
提交时间 |
2016-04-15 09:39:23 |
显示代码纯文本
#include<cstdio>
#include<algorithm>
int n,m;int ans=1234567898;
int weizhi[1111]={};int shuliang[1111]={};
struct ff{int x,y;}f[55555]={};int e[55555]={};ff g[1111]={};
int a[1111]={};int b[1111]={};bool vis[1111]={};
bool cmpp(ff m,ff n){return m.x<n.x;}
void slove1()
{
ans=0;
for(int i=1;i<=n;i++)
{
int maxx=0;
for(int j=weizhi[i];j<weizhi[i+1];j++)
if(a[e[j]]>maxx)
maxx=a[e[j]];
ans+=maxx;
}
for(int i=1;i<=n;i++)
g[i].x=b[i],g[i].y=i;
std::sort(g+1,g+1+n,cmpp);
int te=0;
for(int ii=1;ii<=n;ii++)
{
te+=g[ii].x;vis[g[ii].y]=1;
int temp=0;
for(int i=1;i<=n;i++)
{
int maxx=0;
for(int j=weizhi[i];j<weizhi[i+1];j++)
if(!vis[e[j]]&&a[e[j]]>maxx)
maxx=a[e[j]];
temp+=maxx;
}
temp+=te;
if(temp<ans)
ans=temp;
}
printf("%d\n",ans);
}
void check()
{
int temp=0;
for(int i=1;i<=n;i++)
{
int maxx=0;
for(int j=weizhi[i];j<weizhi[i+1];j++)
if(!vis[e[j]]&&a[e[j]]>maxx)
maxx=a[e[j]];
temp+=maxx;
}
for(int i=1;i<=n;i++)
if(vis[i])
temp+=b[i];
if(temp<ans)
ans=temp;
}
void dfs(int a)
{
if(a>n){check();return;}
vis[a]=1;dfs(a+1);
vis[a]=0;dfs(a+1);
}
int main()
{
freopen("energynet.in","r",stdin);
freopen("energynet.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
for(int i=1;i<=m;i++)
scanf("%d%d",&f[i].x,&f[i].y),shuliang[f[i].x]++;
for(int i=1;i<=n+1;i++)
weizhi[i]=weizhi[i-1]+shuliang[i-1];
for(int i=1;i<=m;i++)
e[weizhi[f[i].x]]=f[i].y,weizhi[f[i].x]++;
for(int i=n+1;i>0;i--)
weizhi[i]=weizhi[i-1];
if(n>23){
slove1();return 0;}
dfs(1);
printf("%d\n",ans);
return 0;
}