洛谷$P4249\ [WC2007]$剪刀石头布 网络流
正解:网络流
解题报告:
题目大意其实就说有一个$n$个节点的有向完全图,然后部分边的方向已经给定了,要求确定所有边的方向使三元环数目有$max$.这里三元环的定义是说三条边的方向一致,即同为顺逆时针$QwQ$
话说这种三元环问题通常就是考虑点的度数?考虑下如果是非三元环一定是有一个入度为2的点,考虑枚举这种点,那就有$as=\binom{n}{3}-\sum\binom{in_i}{2}=\frac{n(n-1)(n-2)}{6}-\sum\frac{in_i^2-in_i}{2}=\frac{n(n-1)(n-2)}{6}+\frac{n(n-1)}{2}-\sum\frac{in_i^2}{2}$,所以现在就是要最小化这个,$\sum\frac{in_i^2}{2}$
这时候要用到费用递增$QwQ$,因为之前都没安利过这个姿势的样子所以大概港下,,,也不会很详细港的因为懒$bushi$
就对于某条边,若费用是关于流量的一个函数,且满足斜率单调增,可以考虑拆边,第$x$条边就$f_{x}-f_{x-1}$,然后就欧克克辣$QwQ$
所以这里一样的嘛,由前面得$f(x)=x^2$显然递增,所以像前面说的那样拆边就好$QwQ$
欧克最后总结下怎么建图$QwQ$?考虑建一排点表示未定向的边,再建一排点表示所有点,于是就$S$向边连流量为1费用为0的边,边向端点连流量为1费用为0的边,各点向$T$连边如上方法
然后就做完辣?
$QwQ$
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define t(i) edge[i].to
#define w(i) edge[i].wei
#define fy(i) edge[i].fy
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define e(i,x) for(ri i=head[x];~i;i=edge[i].nxt) const int N=1e4+;
int head[N],ed_cnt=-,vis[N],S,T,fr_ed[N],fr_nod[N],dis[N],g[N][N],du[N],num[N],nod_cnt,n,as;
struct ed{int to,nxt,wei,fy;}edge[N<<];
struct node{int x,y;}nod[N]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(ri x,ri y,ri z,ri p)
{edge[++ed_cnt]=(ed){x,head[y],z,p};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x],,p};head[x]=ed_cnt;}
il bool spfa()
{
queue<int>Q;Q.push(S);memset(vis,,sizeof(vis));vis[S]=;memset(dis,,sizeof(dis));dis[S]=;
while(!Q.empty())
{
ri nw=Q.front();Q.pop();vis[nw]=;
e(i,nw)
if(w(i) && fy(i)+dis[nw]<dis[t(i)])
{dis[t(i)]=dis[nw]+fy(i),fr_ed[t(i)]=i,fr_nod[t(i)]=nw;if(!vis[t(i)])Q.push(t(i)),vis[t(i)]=;}
}
if(dis[T]==dis[])return ;
ri flow=dis[T+];
for(ri i=T;i!=S;i=fr_nod[i])flow=min(flow,w(fr_ed[i]));
for(ri i=T;i!=S;i=fr_nod[i])w(fr_ed[i])-=flow,w(fr_ed[i]^)+=flow;as+=dis[T]*flow;
return ;
} int main()
{
memset(head,-,sizeof(head));n=read();S=n+,T=nod_cnt=n+;
rp(i,,n)
{
rp(j,,n)
{
g[i][j]=read();
if(g[i][j]== && i<j)
{nod[++nod_cnt]=(node){i,j};ad(nod_cnt,S,,);ad(i,nod_cnt,,);ad(j,nod_cnt,,);++num[i];++num[j];}
else du[i]+=g[i][j];
}
}
rp(i,,n){as+=du[i]*du[i];rp(j,,num[i])ad(i,T,,*(du[i]+j)-);}
while(spfa());
printf("%d\n",n*(n-)*(n-)/-(as-n*(n-)/)/);
rp(i,n+,nod_cnt)
{
ri tmp;e(j,i)if(t(j)!=S && !w(j)){tmp=t(j);break;}
if(tmp==nod[i].x)g[nod[i].x][nod[i].y]=,g[nod[i].y][nod[i].x]=;
else g[nod[i].x][nod[i].y]=,g[nod[i].y][nod[i].x]=;
}
rp(i,,n){rp(j,,n)printf("%d ",g[i][j]);printf("\n");}
return ;
}
没写完,不想写了$kk$,先存着$kk$
洛谷$P4249\ [WC2007]$剪刀石头布 网络流的更多相关文章
- 洛谷P1251 餐巾(网络流)
P1251 餐巾 15通过 95提交 题目提供者该用户不存在 标签网络流贪心 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 为什么我全部10个测试点都对… 题目描述 一个餐厅在相继的N天里 ...
- 3150luogu洛谷
若说代码 那真的是很水 但是 思想却有点意思 这道题是洛谷博弈论专题的第一道入门题, 然而刚开始我是不会做的, 毕竟是道入门题, 我博弈论还没入门呢. 这道题的做法就是: 如果m为偶数, 那么先手赢( ...
- P1219 八皇后 洛谷
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...
- 洛谷$P4177\ [CEOI2008]\ order$ 网络流
正解:网络流 解题报告: 传送门$QwQ$ 开始看感$jio$长得好像和太空飞行计划差不多的,,,然后仔细康康发现还有租操作,,, 按一般的套路碰到这样儿的一般就先按非特殊化的建图然后考虑怎么实现这个 ...
- 洛谷$P2050\ [NOI2012]$美食节 网络流
正解:网络流 解题报告: 传送门$QwQ$ 昂开始看到$jio$得,哇长得好像上一题嗷$QwQ$ 然后仔细康康数据范围,发现,哇好像要几万个点,,,显然就$GG$了 但感$jio$思路方向好对的亚子? ...
- 洛谷$P2053\ [SCOI2007]$修车 网络流
正解:网络流 解题报告: 传送门$QwQ$ 一个很妙的建图,,,说实话我麻油想到$QwQ$ 考虑对每个工人建$n$个点,表示这是他修的倒数第$i$辆车,就可以算出影响是$t\cdot i$,然后对每辆 ...
- 洛谷$P3308\ [SDOI2014]LIS$ 网络流
正解:网络流 解题报告: 传送门$QwQ$ 恩先不考虑关于那个附加属性的限制,考虑这题怎么做? 首先这题从名字开始就让人忍不住联想起网络流24题里的那个最长不下降子序列?于是同样考虑预处理一个$f$呗 ...
- 洛谷$P2046\ [NOI2010]$海拔 网络流+对偶图
正解:网络流+对偶图 解题报告: 传送门$QwQ$ $umm$之前省选前集训的时候叶佬考过?然而这和我依然不会做有什么关系呢$kk$ 昂这题首先要两个结论?第一个是说每个位置的海拔一定是0/1,还一个 ...
- 洛谷$P3227\ [HNOI2013]$切糕 网络流
正解:网络流 解题报告: 传送门! 日常看不懂题系列,,,$QAQ$ 所以先放下题目大意趴$QwQ$,就说有个$p\cdot q$的矩阵,每个位置可以填一个$[1,R]$范围内的整数$a_{i,j}$ ...
随机推荐
- 洞见数据库前沿 阿里云数据库最强阵容 DTCC 2019 八大亮点抢先看
摘要: 作为DTCC的老朋友和全球领先的云计算厂商,阿里云数据库团队受邀参加本次技术盛会,不仅将派出重量级嘉宾阵容,还会为广大数据库业内人士和行业用户奉上8场精彩议题.下面小编就为大家提前梳理了8大亮 ...
- 16-1 djanjo介绍
一 web框架的本质 1用户的浏览器(socket客户端) 和 网站的服务器(socket服务端)之间 2 HTTP协议: 1.1 请求(request) 1.2. 响应(response) 3 we ...
- Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) 题解
A..B略 C 对当前的值排序,再二分答案,然后对于(i%x==0 && i%y==0)放入大的,再放其他的贪心解决即可. #include<iostream> #incl ...
- oracle函数greatest(exp1,exp2,exp3,……,expn)
[功能]返回表达式列表中值最大的一个.如果表达式类型不同,会隐含转换为第一个表达式类型. [参数]exp1……n,各类型表达式 [返回]exp1类型 [示例] SELECT greatest(10,3 ...
- Install Openjdk11 to Ubuntu 18.04 LTS
Ubuntu 18.04 LTS系统上通过sudo apt install openjdk-11-*命令安装的jdk11版本依然是jdk10,怎么样才能安装openjdk 11呢,今天,我们就来完 ...
- Python 函数参数有冒号 声明后有-> 箭头 返回值注释 参数类型注释
在python3.7 环境下 函数声明时能在参数后加冒号,如图: 1 def f(ham: str, eggs: str = 'eggs') -> str : 2 print("Ann ...
- supersockets支持热更新的服务器实例配置选项
SuperSocket 支持以下配置选项的热更新: * logCommand * idleSessionTimeOut * maxRequestLength * logBasicSessionActi ...
- Python--day19--sys模块
sys模块 sys模块是与python解释器交互的一个接口 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys. ...
- Spring的注解@Qualifier注解
@Qualifier注解了,qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的,我们修改调用代码,添加@Qualifier注解,需要注意的是@Qualifier的参数名称 ...
- Python--day28--set去重
set去重:set依赖对象hash eq