题目

思路:

将问题转化成最小费用流

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define pdd pair<double, double>
#define mem(a, b) memset(a, b, sizeof(a))
#define debug(x) cerr << #x << " = " << x << "\n";
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//head const int N = + ;
const int INF = 0x3f3f3f3f;
int a[N][N];
struct edge {
int to, cap, cost, rev;
};
int V;
vector<edge>g[N];
int h[N], dis[N], prevv[N], preve[N];
void add_edge(int u, int v, int cap, int cost) {
g[u].pb({v, cap, cost, g[v].size()});
g[v].pb({u, , -cost, g[u].size()-});
}
int min_cost_flow(int s, int t, int f) {
int res = ;
mem(h, );
while(f > ) {
priority_queue<pii, vector<pii>, greater<pii> > q;
mem(dis, 0x3f);
dis[s] = ;
q.push({, s});
while(!q.empty()) {
pii p = q.top();
q.pop();
int v = p.se;
if(dis[v] < p.fi) continue;
for (int i = ; i < g[v].size(); ++i) {
edge &e = g[v][i];
if(e.cap > && dis[e.to] > dis[v] + e.cost + h[v] - h[e.to]) {
dis[e.to] = dis[v] + e.cost + h[v] - h[e.to];
prevv[e.to] = v;
preve[e.to] = i;
q.push({dis[e.to], e.to});
}
}
}
if(dis[t] == INF) return -;
for (int v = ; v < V; ++v) h[v] += dis[v];
int d = f;
for (int v = t; v != s; v = prevv[v]) d = min(d, g[prevv[v]][preve[v]].cap);
f -= d;
res += d*h[t];
for (int v = t; v != s; v = prevv[v]) {
edge &e = g[prevv[v]][preve[v]];
e.cap -= d;
g[v][e.rev].cap += d;
}
}
return res;
}
int main() {
int n = ;
for (int i = ; i <= n; ++i) {
for (int j = ; j <= n; ++j) {
scanf("%d", &a[i][j]);
add_edge(i, j+n, , -a[i][j]);
}
}
int s = , t = n+n+;
V = t+;
for (int i = ; i <= n; ++i) add_edge(s, i, , );
for (int i = ; i <= n; ++i) add_edge(i+n, t, , );
cout << *n - min_cost_flow(s, t, n);
return ;
}

最新文章

  1. poj 1141 Brackets Sequence (区间dp)
  2. python函数基础 与文件操作
  3. 数据库事务中的隔离级别和锁+spring Transactional注解
  4. Java反射机制&lt;1&gt;
  5. dubbo源码分析1-reference bean创建
  6. PHP面向对象(分页)
  7. 分享MYSQL中的各种高可用技术(源自姜承尧大牛)
  8. iOS下的实际网络连接状态检测(转)
  9. Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程)
  10. virtualbox命令行共享CentOS目录
  11. Vue.js与Jquery的比较 谁与争锋 js风暴
  12. &amp;&amp;和&amp;、||和|的区别
  13. warnings.warn(&quot;allowed_domains accepts only domains, not URLs. Ignoring URL entry %s in allowed_doma
  14. Kafka(3)--kafka消息的存储及Partition副本原理
  15. GenericFactoryMethod泛型工厂模式实现简单IOC功能
  16. JS面向对象的程序设计之理解对象
  17. Python学习第一章
  18. android 监听动画对象后不能播放动画
  19. Messages: java.lang.NullPointerExceptionFile: org/apache/jsp/test_jsp.javaLine number: 23
  20. C++应该被看成是个语言集合——四种语言(C语言,OO语言,泛型语言,STL)

热门文章

  1. CSAPP:第二章学习笔记:斗之气2段
  2. DDD关键知识点整理汇总
  3. win openssl 生成证书
  4. appium 3 跑起来
  5. 旷视研究院Detection组负责人
  6. day16 python之匿名函数,递归函数
  7. # 2017-2018-2 20155228 《信息安全系统设计原理》 使用VirtualStudio2008创建和调用静态库和使用VirtualC++6.0创建和调用动态库
  8. 【Spark-SQL学习之二】 SparkSQL DataFrame创建和储存
  9. v-charts简介
  10. 使用OGG添加唯一标识字段到目标表