[BZOJ2597][Wc2007]剪刀石头布(费用流)

避坑指南:CATIA V5设计支架零件时,草图约束和特征顺序的那些‘坑’ 本文深入探讨了CATIA V5在支架类零件设计中的关键技巧,重点解析草图约束和特征顺序的常见问题与解决方案。通过实战案例展示如何避免模型崩溃、提升设计稳健性,并分享高效建模的七个习惯,帮助工程师从工具操作升级到设计思维,显著提高工作效率。 阅读详情

=== ===

这里放传送门

=== ===

题解

这道题如果考虑直接计算合法的三元组数目好像有点不大科学。。因为只有三场都比完了才能发现这是一个合法组。那么如果考虑不合法情况呢?合法情况肯定是一个有向的三元环,那么不合法情况就是从一个点出发了两条边。也就是说如果有一个人赢了两场比赛,那么就会产生一个不合法三元组。以此类推,如果 有一个人P一共赢了k个人,那么从这k个人里面随便选出两个人来跟P构成的三元组肯定都是不合法的。

那么只需要求出能够产生最少不合法组的情况就可以了。设 C(x)=x(x−1)2 ,那么如果一个人P赢了一场比赛,它现在总共赢了 v 场比赛,那么第v场比赛的贡献就是 C(v)−C(v−1) 。那么考虑用费用流来模拟这个过程,为每场比赛建立一排点,从S连到它们,流量为1费用为0;每个比赛向它涉及到的两个人连流量为1费用为0的边,表示这场比赛要么A赢要么B赢。然后每个人再向T连很多边,每条边的费用都是 C(v)−C(v−1) ,流量为1。这样的话它会自动选费用小的边先走,就相当于模拟了v的递增。

一开始感觉边好像会很多然后写了个动态加边。。然而好像不用动态加边也是可以的。对于构造方案的话,可以发现每一场比赛连出去的那两条边的流量情况就代表了比赛的输赢,可以直接访问这些边得出合法方案。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 1000000000
#define inc(x)(x=(x==11000)?1:x+1)
using namespace std;
int n,a[110][110],p[11010],dis[11010],q[11010],head,tail,pre[11010],tot,S,T,Cost;
int sum[110],cnt,num[110][110],rec[110][110];
bool ext[11010];
struct edge{
    int to,flw,cst,nxt,id;
}e[500010];
void add(int from,int to,int flow,int cost,int idf){
    e[tot].to=to;e[tot].flw=flow;e[tot].cst=cost;
    e[tot].nxt=p[from];e[tot].id=idf;p[from]=tot++;
}
int calc(int v){return v*(v-1)/2;}
void change(int now){
    int v=e[now].id,val;
    e[now].id=e[now^1].id=0;
    ++sum[v];val=calc(sum[v]+1)-calc(sum[v]);
    add(v+cnt,T,1,val,v);//动态加边
    add(T,v+cnt,0,-val,-v);
}
int Increase(int S,int T){
    int Min=inf;
    for (int i=T;i!=S;i=e[pre[i]^1].to)
      Min=min(Min,e[pre[i]].flw);
    for (int i=T;i!=S;i=e[pre[i]^1].to){
        e[pre[i]].flw-=Min;
        e[pre[i]^1].flw+=Min;
        if (e[pre[i]].id>0)
          change(pre[i]);
    }
    return Min;
}
bool SPFA(int &Cost){
    int delta;
    memset(dis,127,sizeof(dis));
    head=0;tail=1;q[tail]=S;
    ext[S]=true;dis[S]=0;
    while (head!=tail){
        int u;
        inc(head);u=q[head];ext[u]=false;
        for (int i=p[u];i!=-1;i=e[i].nxt)
          if (e[i].flw>0&&dis[e[i].to]>dis[u]+e[i].cst){
              int v=e[i].to;pre[v]=i;
              dis[v]=dis[u]+e[i].cst;
              if (ext[v]==false){
                  inc(tail);q[tail]=v;ext[v]=true;  
              }
          }
    }
    if (dis[T]>inf) return false;
    delta=Increase(S,T);
    Cost+=delta*dis[T];
    return true;
}
int main()
{
    memset(p,-1,sizeof(p));
    scanf("%d",&n);S=0;
    for (int i=1;i<=n;i++)
      for (int j=1;j<=n;j++){
          scanf("%d",&a[i][j]);
          if (a[i][j]==1) ++sum[i];
          if (a[i][j]==2){
              if (i<=j){
                  num[i][j]=++cnt;
                  add(S,cnt,1,0,0);
                  add(cnt,S,0,0,0);
              }
          }
      }
    T=cnt+n+1;
    for (int i=1;i<=n;i++){
        int val=calc(sum[i]);
        Cost+=val;//记录已经存在的不合法三元组
        val=calc(sum[i]+1)-val;//计算增量
        add(i+cnt,T,1,val,i);
        add(T,i+cnt,0,-val,-i);
    }
    memset(rec,-1,sizeof(rec));
    for (int i=1;i<=n;i++)
      for (int j=i;j<=n;j++)
        if (a[i][j]==2){
            int now=num[i][j];
            rec[i][j]=tot;//记录每一场比赛对应的边的编号
            add(now,i+cnt,1,0,0);add(i+cnt,now,0,0,0);
            add(now,j+cnt,1,0,0);add(j+cnt,now,0,0,0);
        }
    while (SPFA(Cost));
    Cost=n*(n-1)*(n-2)/6-Cost;
    printf("%d\n",Cost);
    for (int i=1;i<=n;i++)
      for (int j=i;j<=n;j++){
          int v=rec[i][j];
          if (v==-1) continue;
          if (e[v].flw==0){a[i][j]=1;a[j][i]=0;}
          else{a[i][j]=0;a[j][i]=1;}
      }
    for (int i=1;i<=n;i++)
      for (int j=1;j<=n;j++)
        printf("%d%c",a[i][j]," \n"[j==n]);
    return 0;
}
#1机器学习(西瓜书)自学记录 《机器学习 》 Datawhale 组队学习, 吃瓜自学笔记。 阅读详情

相关推荐

RK3566添加ffpeg【Buildroot系统】

有很多人都发现了RK3566系列的芯片是不可以直接使用ffmpeg官网源码的!会报错: Not a video capture device. /dev/video0: No such device 接下来我们就来解决这个问题!!

honmy18的博客 4070

BZOJ2597: [Wc2007]剪刀石头布

BZOJ2597: [Wc2007]剪刀石头布费用流 之 特殊性质建图题解:感觉数据范围像网络流之类的,但是根本不会做。。。当直观建模失效的时候,就弃疗吧,一般要么就是线性规划建图,要么就是有特殊的性质。我们注意到图中的边是完全的,这时候应该想到总共有C(n,3)个三角形,正难则反,减去不符合条件的就是答案。定义a败给b等价于a->b,当一个三角形中的一个点x有两条出边时,这个三角形就是不符合条件的

FTM's Blog 472

以GD32F103C8T6为例的核心板原理图PCB绘制学习笔记简单总结

重点在supplier part是立创商城的编号,可以搜到。

2301_80397661的博客 3262

【bzoj 2597】剪刀石头布(费用流)

传送门biu~ 一张竞赛图中,任意选三个点如果不形成环,那么一定有一个点的出度为2。也就是每当在任意一个点中找到任意两个出度,图中就会失去一个三元环。 令点i" role="presentation" style="position: relative;">iii的出度为degreei" role="presentation" style="position: relative;">degre

zP1nG 404

网口通信实战(C#完整版):基于TCP协议的工业仪表数据采集系统开发

工业现场中80%的智能仪表(压力/温度/液位/流量/数显仪表)、采集模块、测控终端均支持TCP网口通信,这类设备的TCP通信有鲜明的工业特性:基于字节流的自定义二进制协议、一问一答的主从通信模式、对数据完整性/稳定性要求极高。本次实战是纯工业级落地项目,基于C# WinForm + .NET Framework 4.8(工业上位机标配)✅纯原生无依赖:零第三方类库/控件,仅用C#原生,源码可100%复用、无引用冲突、工控机完美兼容;✅双采集模式完美适配:同时实现「单次手动采集」+「连续自动采集」

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1802

华为 MetaERP · 本体论驱动的 PTP 全流程智能建模方案

华为MetaERP通过“本体+事件+图谱+Agent”四位一体架构,将传统ERP从“记录系统”升级为“智能执行系统”。基于OWL本体实现业务语义精准表达,融合LLM与元数据多租能力,构建可推理、可治理的PTP全流程智能模型,解决AI理解业务逻辑难题,实现三单匹配自动化、关账效率提升30%、成本降低50%,推动企业数字化迈向可信智能新范式。

金牌架构师 181

Bzoj2597 [Wc2007]剪刀石头布

Time Limit:20 SecMemory Limit:128 MBSecSpecial JudgeSubmit:1153Solved:543 Description 在一些一对一游戏的比赛(如下棋、乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之为剪刀石头布情况。有的时候,无聊的人们会津津乐道于统计有多少这...

dezhen7015的博客 178

【专栏导引贴】100+智能优化算法:从背景原理到代码实战(持续更新)

本专栏系统整理100+种现代优化算法,涵盖粒子群优化(PSO)、遗传算法(GA)、鲸鱼优化(WOA)等经典方法,以及白鲸优化(BWO)、非洲秃鹫优化(AVOA)等新兴算法。每篇详解包含生物启发原理、数学模型、代码实现及工程应用,采用统一编程风格,提供可直接运行的实例代码。专栏持续更新,旨在为研究者提供系统化的智能优化算法参考资料,实现从理论到实践的完整知识链。目前已收录23种算法,包括蚁群系统(ACS)、蝙蝠算法(BA)、天牛须搜索(BAS)等自然启发式优化方法。

qq_42212808的博客 3654

[WC2007]剪刀石头布 Solution

题意:给一张竞赛图,图中部分边的方向已经确定,现在要给那些不确定的边定向,求图中最多能有多少三元环。 显然三元环不方便直接求。考虑如何反着求。 答案最多是n×(n−1)×(n−2)6\dfrac{n\times (n-1)\times (n-2)}{6}6n×(n−1)×(n−2)​。 那么对于一个人,设他获胜的场数为xxx,那么整个三元环的数量就会减少x×(x−1)2\dfrac{x\times...

chenzhuo__的博客 174

手把手保姆级|Python爬取微信公众号文章完整版,反反爬策略拉满,附可运行完整代码(永久可用)

做Python爬虫的朋友都知道,爬取微信公众号文章 绝对是爬虫领域的「香饽饽」也是「硬骨头」。一方面,微信公众号的文章是极具价值的数据源:不管是自媒体从业者做竞品分析、新媒体运营者整理干货、还是个人学习收集资料,都需要批量爬取公众号文章;另一方面,微信的反爬机制堪称全网最严苛之一 ——腾讯对微信生态的风控做到了极致,动态渲染页面、高频IP封禁、Cookie短时效失效、请求头严格校验、自动化工具秒识别、频繁请求直接拉黑,这些反爬手段让90%的爬虫新手望而却步:要么爬了几篇就被封IP,要么Cookie失效爬取中

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2626

飞行机械臂设计

其后对飞行机械臂系统的机 理模型和基于 ADAMS 的物理模型进行了控制系统的搭建,对于机理模 型,设计了三个输入通道,分别是俯仰力矩,翻滚力矩与偏航力矩,控 制量为翻滚角,俯仰角,偏航角。四旋翼无人机自身具有独特的优势,在无人机上增加机械臂,整个 机体系统相当于一架空中行动自如的空中机器人,可以适应更多的应用场合,能够实现空中抓取,运输载荷,巡航监视等任务。的函数模块如图 4-8 所示,可见输入为 U1,U2,U3,U4,分别对应总力矩,俯仰力矩,翻滚力矩,偏航力矩,控制 量为俯仰角,翻滚角,偏航角。

coldmood77的博客 2916

BZOJ 2597 WC2007 剪刀石头布 费用流

题目大意:给定一个竞赛图,一些边没有指定方向,求一个指定方向的方案使竞赛图中三元环的数量最多 直接做不好做,我们考虑补集法 三个点之间如果不是三元环,那么一定有一个点有两条出边 于是我们可以得到ans=C(n,3)-ΣC(degree[x],2) 于是我们考虑费用流的模型 每条边化为一个点 从源点向每个点连n-1条边,流量为1,费用为0,1,...,n-2 一条边如果可以或必须成为一

世界 2847

【WRF-Chem Emissions教程第一期】WRF-Chem 排放概述

WRF-Chem 排放概述

WW、forever的博客 852

BZOJ-2597 [Wc2007]剪刀石头布(费用流)

2597: [Wc2007]剪刀石头布 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special Judge Submit: 1146  Solved: 538 [Submit][Status][Discuss] Description 在一些一对一游戏的比赛(如下棋、乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过

十分残念的博客 684

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

BZOJ 2597: [Wc2007]剪刀石头布 费用流

Description在一些一对一游戏的比赛(如下棋、乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之为剪刀石头布情况。有的时候,无聊的人们会津津乐道于统计有多少这样的剪刀石头布情况发生,即有多少对无序三元组(A, B, C),满足其中的一个人在比赛中赢了另一个人,另一个人赢了第三个人而第三个人又胜过了第一个人。注意这里无序的意思是说三元组中元素的顺序

LZJ209的博客 924

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【BZOJ2597】[Wc2007]剪刀石头布 最小费用流

【BZOJ2597】[Wc2007]剪刀石头布 Description 在一些一对一游戏的比赛(如下棋、乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之为剪刀石头布情况。有的时候,无聊的人们会津津乐道于统计有多少这样的剪刀石头布情况发生,即有多少对无序三元组(A, B, C),满足其中的一个人在比赛中赢了另一个人,另一个人赢了第三个...

aodanchui1057的博客 128

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

[Wc2007]剪刀石头布 题目大意:https://www.lydsy.com/JudgeOnline/problem.php?id=2597 题解: 发现直接求三元环不好求,我们考虑任选三个点不是三元环的个数。 这样的话,必定是有一个点被其余两个点指,我们就根据这个来求。 又发现,最后的答案之和所有点的度数有关。 就是,$\sum C_{d_i}^{2}$。 紧接着...

weixin_30832143的博客 143

【bzoj2597】[Wc2007]剪刀石头布 费用流

不错的题。 ans=n*(n-1)*(n-2)/6-d[i]*(d[i]-1)/2 d[i]表示第i个人胜场次数 d[i]每增加1,ans减少d[i] 源点S向每个点连n-1条容量为1的边,费用分别为0、1、……n-2 每条边对应的点向汇点T连一条容量为1,费用为0的边 每个点向从自己连出的边连一条容量为1,费用为0的边 最小费用最大流 方案数就是看一条边是否满流,满流就是选,否则

Oxer的专栏 825

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

题面 题目传送门 解法 简单来说,题意就是确定一些无向边的方向,使得三元环的个数最多。 考虑所有边都确定的情况下怎么计算三元环的个数,假设每一个点的度数为d[i]d[i]d[i],通过容斥原理可以得到(n3)−∑i=1n(d[i]2){n\choose 3}-\sum_{i=1}^n{d[i]\choose 2}(3n​)−∑i=1n​(2d[i]​)。 那么我们可以将那些没有确定的边按照编号提...

mysterynoip的博客 253

【BZOJ】【P2597】【Wc2007】【剪刀石头布】【题解】【费用流】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2597 wc的题不看题解能做? http://xietutu.com/archives/958 话说lrj的费用流模板常数真是一坨翔,好在氧气+linux+神评测机让我卡时过了 Code: #include using namespace std; const int maxn=2

退役狗的专栏 921

【BZOJ2597】【Wc2007】剪刀石头布 费用流,没写zkw卡时过

题解,比较常规式是费用流,没写那个神贪心。 首先是三元环需要取补集,先C(n,3)算出总环数,然后减去失败的三元环。 我们发现在一个三元环中,如果有某个选手入度(or 出度)为2,那么就会破坏这个环。 所以当选手有x个度时,就会破坏∑(i∈[0,x])个三元环(0+....+x-1),P.S.这个是C(x,2)推出来的。 建图: 第一层源点     到下一层每个点若干条边 

辗转山河弋流歌 1802

【BZOJ】2597: [Wc2007]剪刀石头布 -费用流&组合数学

传送门:bzoj2597 题解 考虑转成图:把每个人看做一个点,比赛为边,胜负确定的比赛的边指向胜的一方。两两之间都要进行比赛,是一个完全图。问题即为给定一些边的方向,现在需要给剩下的边定向,使得满足题目要求的三元环尽量多。 易得人数为nnn时,三元环总数为(n3)(n3)\dbinom n3,满足要求的三元环必然可以缩点,而考虑一个不满足条件的三元环:存在一个点在三元环中入度为22...

远行客 376

[bzoj2597][Wc2007]剪刀石头布【费用流】

【题目链接】   https://www.lydsy.com/JudgeOnline/problem.php?id=2597 【题解】   考虑从总的方案数中减去不合法的方案数,一个不合法的三元环,一定有且只有点的出度为3。所以一个度数为kkk的点会产生1+2+..k−1=k∗(k−1)/21+2+..k−1=k∗(k−1)/21 + 2 + .. k - 1=k*(k - 1)/2个不合法...

D_Vanisher的博客 372

bzoj 2597: [Wc2007]剪刀石头布(费用流)

2597: [Wc2007]剪刀石头布 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special Judge Submit: 1011  Solved: 476 [Submit][Status][Discuss] Description 在一些一对一游戏的比赛(如下棋、乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过

clover_hxy的博客 556
上一篇: SDOI2017Round1解题报告!
下一篇: 字符串循环同构——最小表示法の板子
FromATP
博客等级 码龄10年 75粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值