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