正题

题目链接:https://www.luogu.com.cn/problem/P4249


题目大意

\(n\)个点的竞赛图有的边已经确定了方向,要求给剩下的边确定一个方向使得图的三元环最多。

\(1\leq n\leq 100\)


解题思路

竞赛图如果三个点不能构成三元环有一个性质就是恰好有一个点的度数等于\(2\),可以考虑减去不能构成三元环的方案。

也就说对于一个点\(x\)如果我们选出它的两条出边那么这个就不能构成三元环而且只会在点\(x\)统计一次。

所以答案就是

\[\binom n 3-\sum_{i=1}^n\binom{deg_i}2
\]

现在我们要最小化后面那个东西,这个就比较简单了,因为对于一条没有确定的边要么给\(x\)加度数要么给\(y\)加度数,我们可以考虑费用流,如果一条边可以指向\(x\)那么就连向点\(x\)费用\(0\)流量\(1\)。

然后对于每个点连接汇点的时候流量都是一,然后费用分别为\(0,1,2,3,...n-1\)就好了。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1e5+10;
struct node{
int to,next,w,c;
}a[N*20];
int n,tot=1,s,t,cnt,ans;
int p[110][110],c[110][110],ls[N],f[N],mf[N],pre[N];
bool v[N];queue<int> q;
void addl(int x,int y,int w,int c){
a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[tot].c=c;
a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;a[tot].c=-c;
return;
}
bool SPFA(){
memset(f,0x3f,sizeof(f));
q.push(s);f[s]=0;v[s]=1;mf[s]=1e9;
while(!q.empty()){
int x=q.front();q.pop();v[x]=0;
for(int i=ls[x];i;i=a[i].next){
int y=a[i].to;
if(a[i].w&&f[x]+a[i].c<f[y]){
f[y]=f[x]+a[i].c;pre[y]=i;
mf[y]=min(mf[x],a[i].w);
if(!v[y])v[y]=1,q.push(y);
}
}
}
return f[t]<=2147483647/3;
}
void Updata(){
int x=t;
ans+=mf[t]*f[t];
while(x!=s){
a[pre[x]].w-=mf[t];
a[pre[x]^1].w+=mf[t];
x=a[pre[x]^1].to;
}
return;
}
int main()
{
scanf("%d",&n);
s=1;t=2;cnt=n+2;
for(int i=3;i<=n+2;i++)
for(int j=0;j<n;j++)
addl(i,t,1,j);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
int x;p[i][j]=++cnt;
scanf("%d",&x);
c[i][j]=x;
if(i>=j)continue;
addl(s,cnt,1,0);
if(x==0||x==2)addl(cnt,j+2,1,0);
if(x==1||x==2)addl(cnt,i+2,1,0);
}
while(SPFA())
Updata();
printf("%d\n",n*(n-1)*(n-2)/6-ans);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(c[i][j]!=2||i>=j)continue;
int x=p[i][j];
if(a[ls[x]].w)c[i][j]=0,c[j][i]=1;
else c[i][j]=1,c[j][i]=0;
}
for(int i=1;i<=n;i++,putchar('\n'))
for(int j=1;j<=n;j++)
printf("%d ",c[i][j]);
return 0;
}

P4249-[WC2007]剪刀石头布【费用流】的更多相关文章

  1. BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)

    BZOJ 洛谷 \(Description\) 给定一张部分边方向已确定的竞赛图.你需要给剩下的边确定方向,使得图中的三元环数量最多. \(n\leq100\). \(Solution\) 这种选择之 ...

  2. [WC2007]剪刀石头布——费用流

    比较有思维含量的一道题 题意:给混合完全图定向(定向为竞赛图)使得有最多的三元环 三元环条件要求比较高,还不容易分开处理. 正难则反 考虑,什么情况下,三元组不是三元环 一定是一个点有2个入度,一个点 ...

  3. BZOJ 2597: [Wc2007]剪刀石头布(费用流)

    传送门 解题思路 考虑全集-不能构成三元环的个数.如果三个点不能构成三元环,一定有一个点的入度为\(2\),继续扩展,如果一个点的度数为\(3\),则会失去3个三元环.对于一个点来说,它所产生的不能构 ...

  4. bzoj 2597 [Wc2007]剪刀石头布——费用流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2597 三个人之间的关系,除了“剪刀石头布”,就是有一个人赢了2局:所以考虑算补集,则每个人对 ...

  5. Luogu4249 WC2007 石头剪刀布 费用流

    传送门 考虑竞赛图三元环计数,设第\(i\)个点的入度为\(d_i\),根据容斥,答案为\(C_n^3 - \sum C_{d_i}^2\) 所以我们需要最小化\(\sum C_{d_i}^2\) 考 ...

  6. P4249 [WC2007]剪刀石头布

    有一个竞赛图,要给一些边定向,求三元环最多的数量 反过来考虑最少的不是环的三个点(称为不好的环),一定有一个点有2条入边,一个点有2条出边,一个点1入边1出边 可以对每一个不好的环只记录入边为2的点, ...

  7. 洛谷$P4249\ [WC2007]$剪刀石头布 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 题目大意其实就说有一个$n$个节点的有向完全图,然后部分边的方向已经给定了,要求确定所有边的方向使三元环数目有$max$.这里三元环的定义是说三条边的方向一 ...

  8. [bzoj2597][Wc2007]剪刀石头布_费用流

    [Wc2007]剪刀石头布 题目大意:https://www.lydsy.com/JudgeOnline/problem.php?id=2597 题解: 发现直接求三元环不好求,我们考虑任选三个点不是 ...

  9. 【bzoj2597】[Wc2007]剪刀石头布 动态加边费用流

    题目描述 在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之为剪刀石头布情况.有的时候,无聊的人们会津津乐道于统计有多少这 ...

  10. BZOJ2597 [Wc2007]剪刀石头布 【费用流】

    题目链接 BZOJ2597 题解 orz思维差 既然是一张竞赛图,我们选出任意三个点都可能成环 总方案数为 \[{n \choose 3}\] 如果三个点不成环,会发现它们的度数是确定的,入度分别为\ ...

随机推荐

  1. RocketMQ可视化控制台

    中午文档 https://github.com/apache/rocketmq-externals/blob/master/rocketmq-console/doc/1_0_0/UserGuide_C ...

  2. 如何在WPF中定义窗体模板

    参考网址:https://www.cnblogs.com/chenxizhang/archive/2010/01/10/1643676.html可以在app.xaml中定义一个ControlTempl ...

  3. mysql优化: 内存表和临时表

    由于直接使用临时表来创建中间表,其速度不如人意,因而就有了把临时表建成内存表的想法.但内存表和临时表的区别且并不熟悉,需要查找资料了.一开始以为临时表是创建后存在,当连接断开时临时表就会被删除,即临时 ...

  4. Leaflet 中 删除 一个 标记(Marker)

    参考:https://blog.csdn.net/qq_34922009/article/details/81184004 下面是我在Leaflet官方文档所找到的答案 ,希望可以帮助到大家 比如以下 ...

  5. Math.round() 函数返回一个数字四舍五入后最接近的整数。

    语法: Math.round(x); 参数:x 返回值:给定数字的值四舍五入到最接近的整数 描述: 如果参数的小数部分大于 0.5,则舍入到相邻的绝对值更大的整数. 如果参数的小数部分小于 0.5,则 ...

  6. Mooc中国大学Python学习笔记--数字类型及操作

    整数类型 只需知道整数无限制,pow(),4进制表示形式 与数学中整数的概念一致 --可正可负,没有取值范限制 --pow(x,y)函数:计算x^y,想算多大算多大 -十进制:10 -二进制,以0b或 ...

  7. SpringCloud分布式配置中心Config

    统一管理所有配置. 1.微服务下的分布式配置中心 简介:讲解什么是配置中心及使用前后的好处 什么是配置中心: 一句话:统一管理配置, 快速切换各个环境的配置 相关产品: 百度的disconf 地址:h ...

  8. save tran tranName

    begin tran 语句将 @@Trancount加 1.Rollback tran将 @@Trancount递减到 0,但 Rollback tran savepoint_name 除外,它不影响 ...

  9. vue3.0入门(三)

    前言 最近在b站上学习了飞哥的vue教程 学习案例已上传,下载地址 class绑定 对象绑定 :class='{active:isActive}' // 相当于class="active&q ...

  10. 微信小程序从入门到实践(一)-设置底部导航栏

    微信小程序最多能加5个导航图标.因为我们只有两个默认页面,这里我们就添加两个导航图标 先看我们要达到的就是这么一个效果 接下来开始实践: (1)准备工作 找几个图标,将上述起好名字的图标 保存到 小程 ...