题面

题解

要求的是

\[\sum_{i=1}^n\sum_{j=1}^na_ia_jb_{i,j} - \sum_{i=1}^na_ic_i
\]

可以看出这是一个最大权闭合子图问题

代码

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define RG register
#define file(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout);
#define clear(x, y) memset(x, y, sizeof(x)) inline int read()
{
int data = 0, w = 1; char ch = getchar();
while(ch != '-' && (!isdigit(ch))) ch = getchar();
if(ch == '-') w = -1, ch = getchar();
while(isdigit(ch)) data = data * 10 + (ch ^ 48), ch = getchar();
return data * w;
} const int N(510), maxn(3000010), INF(0x3f3f3f3f);
struct edge { int next, to, cap; } e[maxn << 1];
int head[maxn], e_num = -1, n, q[maxn], tail, lev[maxn], cur[maxn];
int S, T, id_b[N][N], id_c[N], idcnt, ans; inline void add_edge(int from, int to, int cap)
{
e[++e_num] = (edge) {head[from], to, cap}; head[from] = e_num;
e[++e_num] = (edge) {head[to], from, cap}; head[to] = e_num;
} int bfs()
{
clear(lev, 0); q[tail = lev[S] = 1] = S;
for(RG int i = 1; i <= tail; i++)
{
int x = q[i];
for(RG int j = head[x]; ~j; j = e[j].next)
{
int to = e[j].to; if(lev[to] || (!e[j].cap)) continue;
q[++tail] = to, lev[to] = lev[x] + 1;
}
}
return lev[T];
} int dfs(int x, int f)
{
if(x == T || (!f)) return f;
int ans = 0, cap;
for(RG int &i = cur[x]; ~i; i = e[i].next)
{
int to = e[i].to;
if(e[i].cap && lev[to] == lev[x] + 1)
{
cap = dfs(to, std::min(f - ans, e[i].cap));
e[i].cap -= cap, e[i ^ 1].cap += cap, ans += cap;
if(ans == f) break;
}
}
return ans;
} inline int Dinic()
{
int ans = 0;
while(bfs())
{
for(RG int i = S; i <= T; i++) cur[i] = head[i];
ans += dfs(S, INF);
}
return ans;
} int main()
{
#ifndef ONLINE_JUDGE
file(cpp);
#endif
clear(head, -1); n = read(); S = ++idcnt;
for(RG int i = 1; i <= n; i++)
for(RG int j = 1; j <= n; j++)
id_b[i][j] = ++idcnt;
for(RG int i = 1; i <= n; i++) id_c[i] = ++idcnt;
T = ++idcnt;
for(RG int i = 1, x; i <= n; i++)
for(RG int j = 1; j <= n; j++)
ans += (x = read()), add_edge(S, id_b[i][j], x),
add_edge(id_b[i][j], id_c[i], INF),
add_edge(id_b[i][j], id_c[j], INF);
for(RG int i = 1, x; i <= n; i++)
x = read(), add_edge(id_c[i], T, x);
printf("%d\n", ans - Dinic());
return 0;
}

最新文章

  1. SICAU教务系统登录密码加密算法的VB方式实现
  2. ViewPager如下效果你研究过吗?
  3. ok6410 android driver(7)
  4. 喜欢的女生快被别人抢走了,我敢怎么抢? - V2EX
  5. ASP.NET静态化方法
  6. HTML5新增属性data-*和js/jquery之间的交互
  7. 新手自定义view练习实例之(一) 泡泡弹窗
  8. Redisson碰到的问题
  9. Python爬虫中文小说网点查找小说并且保存到txt(含中文乱码处理方法)
  10. 一个可爱 &amp; 小清新的加载等待Android控件
  11. 011-docker-安装-rabbitmq-management:3.7.13
  12. Javascropt-KeyCode
  13. CefSharp 支持mp4
  14. AJAX 请求中多出了一次 OPTIONS 请求 导致 Laravel 中间件无法对 Header 传入的 Token 无法获取
  15. PHP验证时有用的几段代码
  16. JavaScript RegExp对象的exec()方法
  17. activity之间參数传递&amp;amp;&amp;amp;获取activity返回值&amp;amp;&amp;amp;activity生命周期
  18. supervisor之启动rabbitmq报错原因
  19. 如何编写安全的PHP代码
  20. bzoj3098 Hash Killer II 生日共计

热门文章

  1. MySql EF6 DBFirst 向导无法生成 edmx 解决方法(同:您的项目引用了最新实体框架;但是,找不到数据链接所需的与版本兼容的实体框架数据库提供程序)
  2. Linux 系统的网络基础_【all】
  3. 铁乐学python_day09_作业
  4. Hadoop HBase概念学习系列之HBase里的时间戳(二十六)
  5. AltiumDesigner元器件搜索中英文对照
  6. QQ邮箱验证码
  7. SQL——快速定位相关的外键表
  8. 三星平板SM-T320刷机
  9. ubuntu安装pycharm并设置快捷方式
  10. 【转】Android应用如何跳转到应用市场详情页面