[费用流]数字配对,新生舞会

文章目录

  • T1:数字配对
    • 题目
    • 题解
    • CODE
  • T2:新生舞会
    • 题目
    • 题解
    • CODE(最大费用最大流版)
    • CODE(最小费用最大流版)

T1:数字配对

题目

有 n 种数字,第 i 种数字是 ai、有 bi 个,权值是 ci。
若两个数字 ai、aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数,
那么这两个数字可以配对,并获得 ci×cj 的价值。
一个数字只能参与一次配对,可以不参与配对。
在获得的价值总和不小于 0 的前提下,求最多进行多少次配对

Input
第一行一个整数 n。
第二行 n 个整数 a1、a2、……、an。
第三行 n 个整数 b1、b2、……、bn。
第四行 n 个整数 c1、c2、……、cn。
Output
一行一个数,最多进行多少次配对

Sample Input
3
2 4 8
2 200 7
-1 -2 1
Sample Output
4

Hint
n≤200,ai≤109,bi≤105,∣ci∣≤105n≤200,ai≤10^9,bi≤10^5,∣ci∣≤10^5n200ai109bi105ci105

题解

首先我们考虑如何判断ai/ajai/ajai/aj为质数,肯定的我们把aiaiaiajajaj进行标准的唯一质因数分解
ajajaj的所有因数aiaiai都有,并且ajajaj的每一个因数的幂≤≤该因数在aiaiai中的幂,这样才能保证ai%aj==0ai\%aj==0ai%aj==0

那么接下来就判断ai/ajai/ajai/aj等于一个质数,其实就是对于一个质因数xxx,设xxxajajaj中的幂为m1m1m1,在aiaiai中的幂为m2m2m2满足m1==m2∣∣m1==m2−1m1==m2||m1==m2-1m1==m2m1==m21且只会有一个质因数在ajajaj的幂小于aiaiai中的幂其他的都是等于,不然两个质因数乘起来还是一个合数


但是我们在建图时会遇到一个问题,如果每一个点都与超级源点和超级汇点建边,有可能直接就只流了该点与源点的边马上就流回了汇点,并没有与其他点产生关系

那么我们为了避免这个问题,就抓住ai/ajai/ajai/aj为一个质数的特殊性,我们发现aiaiai的所有质因数的幂的和一定等于ajajaj的所有质因数的幂的和+1+1+1
在这里插入图片描述
所以如果两个数的质因数的幂的和都是奇数或者都是偶数,那么两数之间一定是不会满足关系的,和至少都差了2,那么我们就把奇数划分成一个区域,与源点建边,流量就是个数,偶数划分成一个区域与汇点建边,流量也是个数,奇数和偶数之间判断幂的和是否只差1,满足的就建边,费用就是能获得的贡献,流量就流无限

CODE

#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 1e9
#define int long long 
#define MAXN 500
struct node {int v, w, next, c, flow;
}edge[MAXN * MAXN];
queue < int > q;
int cnt, n, m, s, t;
int head[MAXN], dis[MAXN], pre[MAXN], a[MAXN], v[MAXN], tot[MAXN];
bool vis[MAXN];void add ( int x, int y, int flow, int cost ) {edge[cnt].next = head[x];edge[cnt].v = y;edge[cnt].w = cost;edge[cnt].c = flow;edge[cnt].flow = 0;head[x] = cnt ++;	
}bool spfa () {memset ( vis, 0, sizeof ( vis ) ); memset ( dis, -0x7f, sizeof ( dis ) );memset ( pre, -1, sizeof ( pre ) );while ( ! q.empty() )q.pop();q.push( s );dis[s] = 0;vis[s] = 1;while ( ! q.empty() ) {int u = q.front();q.pop();vis[u] = 0;for ( int i = head[u];~ i;i = edge[i].next ) {int v = edge[i].v;if ( dis[v] < dis[u] + edge[i].w && edge[i].c > edge[i].flow ) {dis[v] = dis[u] + edge[i].w;pre[v] = i;if ( ! vis[v] ) {q.push( v );vis[v] = 1;}}}} return pre[t] != -1;
}int Fabs ( int x ) {if ( x < 0 )return -x;return x;
}void MCMF ( int &maxflow, int &mincost ) {maxflow = mincost = 0;while ( spfa() ) {int MIN = INF;for ( int i = pre[t];~ i;i = pre[edge[i ^ 1].v] )MIN = min ( MIN, edge[i].c - edge[i].flow );if ( mincost + MIN * dis[t] < 0 ) {//不能流完就尽量流,因为这个delta是单峰,一旦下降便不会在上升 maxflow += ( mincost / -dis[t] );break;}maxflow += MIN;for ( int i = pre[t];~ i;i = pre[edge[i ^ 1].v] ) {edge[i].flow += MIN;edge[i ^ 1].flow -= MIN;mincost += MIN * edge[i].w;}}
}signed main() {memset ( head, -1, sizeof ( head ) );scanf ( "%lld", &n );for ( int i = 1;i <= n;i ++ ) {scanf ( "%lld", &a[i] );int x = a[i];for ( int j = 2;j * j <= x;j ++)while ( x % j == 0 ) {x /= j;tot[i] ++;}if ( x != 1 )tot[i] ++;}s = 0;t = n + 1;for ( int i = 1;i <= n;i ++ ) {int w;scanf ( "%lld", &w );if ( tot[i] & 1 ) {add ( s, i, w, 0 );add ( i, s, 0, 0 );}else {add ( i, t, w, 0 );add ( t, i, 0, 0 );}}for ( int i = 1;i <= n;i ++ )scanf ( "%lld", &v[i] );for ( int i = 1;i <= n;i ++ ) {if ( tot[i] & 1 ) {for ( int j = 1;j <= n;j ++ )if ( Fabs ( tot[i] - tot[j] ) == 1 && ( a[i] % a[j] == 0 || a[j] % a[i] == 0 ) ) {add ( i, j, INF, v[i] * v[j] );add ( j, i, 0, - ( v[i] * v[j] ) );}}}int maxflow, mincost;MCMF ( maxflow, mincost );printf ( "%lld", maxflow );return 0;
} 

T2:新生舞会

题目

学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴。有n个男生和n个女生参加舞会
买一个男生和一个女生一起跳舞,互为舞伴。Cathy收集了这些同学之间的关系,比如两个人之前认识没计算得出 a[i][j] ,表示第i个男生和第j个女生一起跳舞时他们的喜悦程度。Cathy还需要考虑两个人一起跳舞是否方便,比如身高体重差别会不会太大,计算得出 b[i][j],表示第i个男生和第j个女生一起跳舞时的不协调程度。
当然,还需要考虑很多其他问题。Cathy想先用一个程序通过a[i][j]和b[i][j]求出一种方案,再手动对方案进行微调。Cathy找到你,希望你帮她写那个程序。一个方案中有n对舞伴,假设没对舞伴的喜悦程度分别是a’1,a’2,…,a’n,
假设每对舞伴的不协调程度分别是b’1,b’2,…,b’n。令
C=(a’1+a’2+…+a’n)/(b’1+b’2+…+b’n),Cathy希望C值最大

Input
第一行一个整数n。
接下来n行,每行n个整数,第i行第j个数表示a[i][j]。
接下来n行,每行n个整数,第i行第j个数表示b[i][j]。
1<=n<=100,1<=a[i][j],b[i][j]<=10^4
Output
一行一个数,表示C的最大值。四舍五入保留6位小数,选手输出的小数需要与标准输出相等

Sample Input
3
19 17 16
25 24 23
35 36 31
9 5 6
3 4 2
7 8 9
Sample Output
5.357143

题解

转化一下答案,即
C=∑i=1nai∑i=1nbiC=\frac{\sum_{i=1}^n a_i}{\sum_{i=1}^{n}b_i}C=i=1nbii=1nai
–>
C∑i=1nbi=∑i=1naiC\sum_{i=1}^nb_i=\sum_{i=1}^na_iCi=1nbi=i=1nai
–>
∑i=1nai−C∑i=1nbi=0\sum_{i=1}^na_i-C\sum_{i=1}^nb_i=0i=1naiCi=1nbi=0
所以我们可以考虑二分答案CCC,判断∑i=1nai−C∑i=1nbi≥0\sum_{i=1}^na_i-C\sum_{i=1}^nb_i≥0i=1naiCi=1nbi0
男生与超级源点建边,女生与超级汇点建边,男女生之间的建边就是aij−xbija_{ij}-xb_{ij}aijxbij的费用
跑一个最大费用最大流

分享另一个想法:我们可以将以上的思路全部去一个反,就变成判断∑i=1nai−C∑i=1nbi<0\sum_{i=1}^na_i-C\sum_{i=1}^nb_i<0i=1naiCi=1nbi<0那就是跑最小费用最大流

仙女都给了代码,
在这里插入图片描述

CODE(最大费用最大流版)

#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
using namespace std;
#define eps 1e-7
#define INF 2e9
#define MAXM 200005
#define MAXN 105
queue < int > q;
int cnt, n, s, t;
int head[MAXN * 10], pre[MAXN * 10];
double dis[MAXM], w[MAXM], c[MAXM], flow[MAXM];
int a[MAXN][MAXN], b[MAXN][MAXN], v[MAXM], nxt[MAXM];
bool vis[MAXM];void add ( int x, int y, double flow_, double cost ) {nxt[cnt] = head[x];v[cnt] = y;w[cnt] = cost;c[cnt] = flow_;flow[cnt] = 0;head[x] = cnt ++;	
}bool spfa () {for ( int i = s;i <= t;i ++ ) {dis[i] = -INF;pre[i] = -1;}q.push( s );dis[s] = 0;vis[s] = 1;while ( ! q.empty() ) {int u = q.front();q.pop();vis[u] = 0;for ( int i = head[u];~ i;i = nxt[i] ) {if ( dis[v[i]] < dis[u] + w[i] && c[i] > flow[i] ) {dis[v[i]] = dis[u] + w[i];pre[v[i]] = i;if ( ! vis[v[i]] ) {q.push( v[i] );vis[v[i]] = 1;}}}}return pre[t] != -1;
}bool MCMF () {double mincost = 0;while ( spfa() ) {for ( int i = pre[t];~ i;i = pre[v[i ^ 1]] ) {flow[i] ++;flow[i ^ 1] --;}mincost += dis[t];}return mincost >= 0;
}int main() {scanf ( "%d", &n );s = 0;t = n << 1 | 1;double sum = 0;for ( int i = 1;i <= n;i ++ )for ( int j = 1;j <= n;j ++ ) {scanf ( "%d", &a[i][j] ); sum += a[i][j];}for ( int i = 1;i <= n;i ++ )for ( int j = 1;j <= n;j ++ )scanf ( "%d", &b[i][j] );double l = 0, r = sum;while ( r - l > eps ) {double mid = ( l + r ) / 2;memset ( head, -1, sizeof ( head ) );cnt = 0;for ( int i = 1;i <= n;i ++ ) {add ( s, i, 1, 0 );add ( i, s, 0, 0 );add ( i + n, t, 1, 0 );add ( t, i + n, 0, 0 );}for ( int i = 1;i <= n;i ++ )for ( int j = 1;j <= n;j ++ ) {add ( i, j + n, 1, a[i][j] * 1.0 - 1.0 * b[i][j] * mid );add ( j + n, i, 0, - ( a[i][j] * 1.0 - 1.0 * b[i][j] * mid ) );}if ( MCMF() )l = mid;elser = mid;}printf ( "%.6f", l );return 0;
} 

CODE(最小费用最大流版)

#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
using namespace std;
#define eps 1e-7
#define INF 2e9
#define MAXM 200005
#define MAXN 105
queue < int > q;
int cnt, n, s, t;
int head[MAXN * 10], pre[MAXN * 10];
double dis[MAXM], w[MAXM], c[MAXM], flow[MAXM];
int a[MAXN][MAXN], b[MAXN][MAXN], v[MAXM], nxt[MAXM];
bool vis[MAXM];void add ( int x, int y, double flow_, double cost ) {nxt[cnt] = head[x];v[cnt] = y;w[cnt] = cost;c[cnt] = flow_;flow[cnt] = 0;head[x] = cnt ++;	
}bool spfa () {for ( int i = s;i <= t;i ++ ) {dis[i] = INF;pre[i] = -1;}q.push( s );dis[s] = 0;vis[s] = 1;while ( ! q.empty() ) {int u = q.front();q.pop();vis[u] = 0;for ( int i = head[u];~ i;i = nxt[i] ) {if ( dis[v[i]] > dis[u] + w[i] && c[i] > flow[i] ) {dis[v[i]] = dis[u] + w[i];pre[v[i]] = i;if ( ! vis[v[i]] ) {q.push( v[i] );vis[v[i]] = 1;}}}}return pre[t] != -1;
}bool MCMF () {double mincost = 0;while ( spfa() ) {for ( int i = pre[t];~ i;i = pre[v[i ^ 1]] ) {flow[i] ++;flow[i ^ 1] --;}mincost += dis[t];}return mincost < 0;
}int main() {scanf ( "%d", &n );s = 0;t = n << 1 | 1;double sum = 0;for ( int i = 1;i <= n;i ++ )for ( int j = 1;j <= n;j ++ ) {scanf ( "%d", &a[i][j] ); sum += a[i][j];}for ( int i = 1;i <= n;i ++ )for ( int j = 1;j <= n;j ++ )scanf ( "%d", &b[i][j] );double l = 0, r = sum;while ( r - l > eps ) {double mid = ( l + r ) / 2;memset ( head, -1, sizeof ( head ) );cnt = 0;for ( int i = 1;i <= n;i ++ ) {add ( s, i, 1, 0 );add ( i, s, 0, 0 );add ( i + n, t, 1, 0 );add ( t, i + n, 0, 0 );}for ( int i = 1;i <= n;i ++ )for ( int j = 1;j <= n;j ++ ) {add ( i, j + n, 1, - ( a[i][j] * 1.0 - 1.0 * b[i][j] * mid ) );add ( j + n, i, 0, a[i][j] * 1.0 - 1.0 * b[i][j] * mid );}if ( MCMF() )l = mid;elser = mid;}printf ( "%.6f", l );return 0;
} 

在这里插入图片描述
byebye,点个赞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core实战项目之CMS 第十三章 开发篇-在MVC项目结构介绍及应用第三方UI

作为后端开发的我来说&#xff0c;前端表示真心玩不转&#xff0c;你如果让我微调一个位置的样式的话还行&#xff0c;但是让我写一个很漂亮的后台的话&#xff0c;真心做不到&#xff0c;所以我一般会选择套用一些开源UI模板来进行系统UI的设计。那如何套用呢&#xff1f;今天…

[FFT/IFFT]快速傅里叶(逆)变化 + 递归和递推模板

现在时间是2021-2-2&#xff0c;重新回来看2019学习的一知半解的FFTFFTFFT&#xff0c;又有了新的理解 所以修改了以往写过的文章&#xff0c;并增添些许内容 因为过去一年多&#xff0c;上了高中&#xff0c;学的知识多了些&#xff0c;以前不懂的有些东西现在看来挺简单的&am…

软件开发模式:瀑布与敏捷

瀑布和敏捷不是什么新概念&#xff0c;这里只是个人在团队合作中不得不去思考而做的归纳和总结&#xff0c;同时记录自己曾经踩过的坑&#xff0c;新瓶装旧酒&#xff0c;希望对你有所启发。瀑布模式瀑布模型是比较传统一种开发模式&#xff0c;特别是在2B的传统企业&#xff0…

.net core+Spring Cloud学习之路 一

文章开头唠叨两句。2019年了&#xff0c;而自己参加工作也两年有余了&#xff0c;用一个词来概括这两年多的生活&#xff0c;就是&#xff1a;“碌碌无为”。也不能说一点收获都没有&#xff0c;但是很少。2019来了&#xff0c;我立志要打破现状&#xff0c;改变自己&#xff0…

P3128 [USACO15DEC]Max Flow P

P3128 [USACO15DEC]Max Flow P 树上差分之点差分模板题 题目描述&#xff1a; FJ给他的牛棚的N(2≤N≤50,000)个隔间之间安装了N-1根管道&#xff0c;隔间编号从1到N。所有隔间都被管道连通了。 FJ有K(1≤K≤100,000)条运输牛奶的路线&#xff0c;第i条路线从隔间si运输到隔…

周末狂欢赛4(1-02E. JM的西伯利亚特快专递,寿司晚宴,荷马史诗)

文章目录T1&#xff1a;1-02E. JM的西伯利亚特快专递题目题解codeT2&#xff1a;寿司晚宴题目题解codeT3&#xff1a;荷马史诗题目题解codeT1&#xff1a;1-02E. JM的西伯利亚特快专递 题目 今天JM收到了一份来自西伯利亚的特快专递&#xff0c;里面装了一个字符串 s &#x…

.NET Core容器化开发系列(一)——Docker里面跑个.NET Core

前言博客园中已经有很多如何在Docker里面运行ASP.NET Core的介绍了。本篇主要介绍一些细节&#xff0c;帮助初学的朋友更加深入地理解如何在Docker中运行ASP.NET Core。安装DockerDocker现支持在主流Linux、Windows和macOS上安装&#xff0c;官方的安装文档请参考docker docs。…

中小研发团队架构实践之生产环境诊断工具WinDbg

生产环境偶尔会出现一些异常问题&#xff0c;WinDbg或GDB是解决此类问题的利器。调试工具WinDbg如同医生的听诊器&#xff0c;是系统生病时做问题诊断的逆向分析工具&#xff0c;Dump文件类似于飞机的黑匣子&#xff0c;记录着生产环境程序运行的状态。本文主要介绍了调试工具W…

多项式的基础操作(逆元/除法/取模/对数ln/开根sqrt/指数exp/快速幂)带模板+luogu全套例题

文章目录多项式的逆元理论推导模板例题&#xff1a;[luogu P4238]【模板】多项式乘法逆题目code多项式的除法/取模理论推导多项式牛顿迭代法模板例题&#xff1a;[luoguP4512]【模板】多项式除法题目code多项式对数ln理论推导模板例题题目code多项式开根sqrt理论推导模板例题题…

从软件工程的角度解读任正非的新年公开信

昨天被任正非的那封《全面提升软件工程能力与实践&#xff0c;打造可信的高质量产品》的公开信刷屏了&#xff0c;作为一个软件工程专业科班出身的软件开发从业者&#xff0c;自然是引起了我&#xff08;宝玉xp&#xff09;的好奇&#xff0c;仔细阅读之下确实让我大吃一惊&…

HttpClient在.NET Core中的正确打开方式

问题来源长期以来&#xff0c;.NET开发者都通过下面的方式发送http请求&#xff1a;using (var httpClient new HttpClient()){var response await httpClient.GetAsync(uri);//do something with response}这段代码理论上来说遵守了C#的最佳实践&#xff0c;HttpClient是IDi…

[CQOI]九连环(FFT优化+高精)

文章目录题目题解code题目 九连环是一种源于中国的传统智力游戏。 如图所示&#xff0c;九个的圆环套在一把“剑”上&#xff0c;并且互相牵连。游戏的目标是把九个圆环全部从“剑”上卸下。 圆环的装卸需要遵守两个规则 1&#xff0e;第一个&#xff08;最右边&#xff09;环…

任正非公开信:投入 20 亿美元全面提升华为软件质量

昨天&#xff0c;华为心声社区发布了来自任正非的公开信《全面提升软件工程能力与实践&#xff0c;打造可信的高质量产品》&#xff0c;信中强调从基础代码做起&#xff0c;全面提升华为软件工程能力和实践&#xff0c;其中提到一些重要举措&#xff0c;包括编码质量、架构设计…

[指数型生成函数专练]chocolate,红色病毒问题,排列组合,字串数

文章目录T1&#xff1a;chocolate题目题解codeT2&#xff1a;“红色病毒”问题题目题解codeT3&#xff1a;排列组合题目题解codeT4&#xff1a;字串数题解codeT1&#xff1a;chocolate 题目 已帮大家翻译了&#xff0c;不要去UVA或者luogu上面交&#xff0c;卡精度&#xff0…

微服务之:从零搭建ocelot网关和consul集群

介绍微服务中有关键的几项技术&#xff0c;其中网关和服务服务发现&#xff0c;服务注册相辅相成。首先解释几个本次教程中需要的术语网关 Gateway&#xff08;API GW / API 网关&#xff09;&#xff0c;顾名思义&#xff0c;是企业 IT 在系统边界上提供给外部访问内部接口服务…

使用 WRK 压力测试工具对 ASP.NET Core 的接口进行压力测试

0. 简要介绍WRK 是一款轻量且易用的 HTTP 压力测试工具&#xff0c;通过该工具我们可以方便地对我们所开发的 WebAPI 项目进行压力测试&#xff0c;并且针对测试的情况返回结果。PS&#xff1a;Wrk 并不能针对测试的结果生成动态的图表&#xff0c;如果有这种需要&#xff0c;可…

[TJOI2019]唱、跳、rap和篮球(指数型生成函数+NTT+卷积)

文章目录题目题解code1&#xff08;NTT&#xff09;code2&#xff08;EGF卷积&#xff09;题目 大中锋的学院要组织学生参观博物馆&#xff0c;要求学生们在博物馆中排成一队进行参观。他的同学可以分为四类&#xff1a;一部分最喜欢唱、一部分最喜欢跳、一部分最喜欢rap&…

Sum of Paths CodeForces - 1467D

Sum of Paths CodeForces - 1467D Tagscombinatorics dp math *2200 题意&#xff1a; 定义一条好的路径&#xff0c;当且仅当从任意点出发之后恰好经过了 k 次移动&#xff0c;定义这条路径的权值为经过点权值的总和(可重)&#xff0c;进行 q 次修改&#xff0c;每次将ak 改…

[矩阵乘法/快速幂专题]Arc of Dream,Recursive sequence,233 Matrix,Training little cats

矩阵快速幂习题复习矩阵乘法及快速幂模板乘法模板快速幂模板T1&#xff1a;Arc of Dream题目题解codeT2&#xff1a;Recursive sequence题目题解codeT3&#xff1a;233 Matrix题目题解codeT4&#xff1a;Training little cats题目题解code做题的时候后悔没有保存过模板&#xf…

你准备好了在云中工作吗?

前几天写了一篇文章 《云时代的.NET》&#xff0c;今天继续这个话题聊下云时代的技能。无服务器计算&#xff0c;容器化&#xff0c;云原生应用&#xff0c;DevOps&#xff0c;人工智能&#xff0c;机器学习以及混合云和多云解决方案等IT趋势正在成为主流或“新常态”。所有大小…