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