POJ 3041 Asteroids

用废旧汽车电池DIY家用UPS:手把手教你低成本搭建Wi-Fi不断电系统 本文详细介绍了如何利用废旧汽车电池DIY低成本家用UPS系统,确保Wi-Fi设备在断电时持续供电。通过精选材料、电路搭建和安全防护,实现高效稳定的电源转换与智能切换,成本仅为市售UPS的三分之一。特别适合家庭办公和远程工作者提升网络供电可靠性。 阅读详情

次元传送门


题目大意:
有一个n*n的棋盘,给出一些点的位置,询问最少去掉多少行和列,可以把所有点去掉,输出行列总数


分析:
这道题,棋盘,点,行,列,有没有想到什么??
没错
二分图………….
最大匹配………..
很惭愧(⊙﹏⊙)b,自己太弱了,对二分图理解不够深刻,没看出来这是个二分图>_<,在YOUSIKI童鞋的友情提示下才知道此题要用二分图解(ˇˍˇ) …………….
所以接下来就要说一说怎么求二分图最大匹配
锵锵锵锵!!!(^o^)/~匈牙利算法闪亮登场
先来说一说匈牙利算法的最核心思想吧—–找增广路
(⊙o⊙)…额,什么是增广路?_?
先要说一下什么叫做交替路:
在已有匹配P的二分图中,存在路径S,v1、v2、v3、v4……∈S,v1∈P,v2∉P,v3∈P,v4∉P……,那么S就是一条交替路
所谓增广路,就是起点和终点都∉P的一条交替路
下图中,9->4->8->1->6->2就是一条增广路
这里写图片描述
增广路一定是奇数条边,因为除了起点和终点其他点都是匹配点,一定存在奇数条边(偶数条匹配边,这是显然的,奇数条未匹配边),再加上由起点和终点衍生出来的两条未匹配边,一定是奇数条边……..
仔细观察,我们会发现,增广路中未匹配路径比匹配路径要多一条,这是很显然的……………因为刚刚我们说明了,除了起点和终点其他点都是匹配点,一定存在奇数条边(偶数条匹配边,这是显然的,奇数条未匹配边),并且未匹配边的个数比匹配边的个数少一,再加上由起点和终点衍生出来的两条未匹配边,所以未匹配边的个数比匹配边的个数多一…………..
有了以上性质,我们就可以计算最大匹配了
首先说有向边:
每一次从一个点出发,寻找增广路,如果找到了增广路,证明匹配数需要+1………………然后就没有然后了
等等!!有个重要问题!!怎么找增广路呢??
依次考虑每个左部节点,为其找到一个右部节点与之匹配。
一个右部节点能与之匹配,必满足一下两个条件之一:
1、这个节点尚未与任何左部节点匹配,此时直接把两个节点进行匹配
2、从该节点匹配的左部节点出发,可以找到一个未标记的右部节点与之匹配,此时给该节点打上标记,递归进入那个左部节点,为它寻找匹配节点

代码如下:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=500+5,maxm=10000+5;
int n,k,hd[maxn*2],to[maxm],nxt[maxm],ans,vis[maxn*2],cnt,pre[maxn*2];
inline int read(void){
    char ch=getchar();
    int f=1,x=0;
    while(!(ch>='0'&&ch<='9')){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return f*x;
}
inline void add(int x,int y){
    to[cnt]=y;
    nxt[cnt]=hd[x];
    hd[x]=cnt++;
}
bool dfs(int u){
    for(int i=hd[u];i!=-1;i=nxt[i]){
        if(!vis[to[i]]){
            vis[to[i]]=true;
            if(pre[to[i]]==-1||dfs(pre[to[i]])){
                pre[to[i]]=u;
                return true;
            }
        }
    }
    return false;
}
signed main(void){
    memset(hd,-1,sizeof(hd)),cnt=0;
    memset(pre,-1,sizeof(pre));
    n=read(),k=read();
    while(k--)
        add(read(),read()+n);
    for(int i=1;i<=n;i++){
        memset(vis,0,sizeof(vis));
        if(dfs(i))
            ans++;
    }
    cout<<ans<<endl;
    return 0;
}

接下来说无向边:
考虑每个未匹配的左部节点,为其寻找一个可以匹配的右部节点,右部节点的匹配条件相同
这里借用一下YOUSIKI童鞋的代码(自己懒得再写一遍了(⊙o⊙)…懒癌晚期……….),希望YOUSIKI童鞋不要收版权费>_<

#include<cstdio>
#include<cstring>
using namespace std;
const int N=1005,M=20005;
int n,m,hd[N],to[M],nt[M],tot,mch[N],chk[N];
inline void addEdge(int x,int y){nt[tot]=hd[x],to[tot]=y,hd[x]=tot++;}
inline bool dfs(int u){
    for(int i=hd[u];~i;i=nt[i])if(!chk[to[i]]){
        chk[to[i]]=1;if(mch[to[i]]==-1||dfs(mch[to[i]])){
            mch[u]=to[i],mch[to[i]]=u;return true;}
    }return false;
}
signed main(void){
    scanf("%d%d",&n,&m);
    memset(hd,-1,sizeof(hd)),tot=0;
    for(int i=1,x,y;i<=m;i++)
        scanf("%d%d",&x,&y),y+=n,
        addEdge(x,y),addEdge(y,x);
    int ans=0;memset(mch,-1,sizeof(mch));
    for(int i=1;i<=n;i++)if(mch[i]==-1){
        memset(chk,0,sizeof(chk));
        if(dfs(i))ans++;
    }printf("%d\n",ans);
}//代码好短>_<.............

by >o< neighthorn

wps js宏获取工作簿、工作表、单元格的值、链接转图片、单元格区域数据转二维数组、保存工作簿的常用Excel操作 wps js宏入门看这里,我写了常用的js操作Excel的方法:获取工作簿对象、获取工作表对象、获取单元格的值、链接转图片、生成条形码图片、单元格区域数据转二维数组方法、保存工作簿、弹出输入框、YesNo选择框,助你从VBA转战JS。 阅读详情

相关推荐

高斯投影坐标正反算算法(python)

高斯坐标正反算算法,在正算的时候,y的第一个数字表示是用几度带换算的,第二个数字和第三个数字表示带号。该程序是根据武汉大学出版社出版的第三版的《大地测量学基础》编写, 用于课程实验学习。

weixin_64338372的博客 4586

【ACM】poj3041 Asteroids 匈牙利算法

POJ-3041 Asteroids 试题链接http://poj.org/problem?id=3041 这个题主要运用了匈牙利算法,在这里强推一篇匈牙利算法趣味精解帖子!(主要是也给自己留一个记录哈哈哈) **趣写算法系列之–匈牙利算法:**https://blog.youkuaiyun.com/dark_scope/article/details/8880547#commentBox 匈牙利算法 匈牙...

爱放火的安小妮的博客 385

【实战解析】RTL8306MB交换芯片驱动开发中的RMII接口调试陷阱

本文深入剖析了RTL8306MB交换芯片驱动开发中RMII接口的典型调试陷阱。通过一个工业网关项目的实战案例,揭示了因硬件原理图设计疏忽导致TX_EN与CRS_DV信号线错接,从而引发网络“哑火”的根本原因。文章详细展示了使用示波器从时钟、数据到控制信号的系统性排查方法,并总结了关键的设计警示与自查清单,为嵌入式网络开发中的软硬件协同调试提供了宝贵经验。

qqq44的博客 1028

poj 3041-Asteroids

Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 Fortunately, Bessie has a powerful weapon that can vaporize all the astero

兵临城下 1265

Excel数据清洗实战:8个必学函数搞定90%的脏数据问题(附案例)

本文通过一个完整的销售数据清洗案例,详细讲解了如何组合使用TRIM、CLEAN、SUBSTITUTE等8个核心Excel函数,构建自动化清洗流水线,高效解决日常办公中90%的脏数据问题,从而将时间留给更有价值的分析工作。

weixin_29215391的博客 582

13、数据可视化与分组操作:Danfo.js 实战指南

本文深入介绍了如何使用 Danfo.js 进行数据可视化与分组操作。内容涵盖多种图表的创建与配置,如折线图、散点图、箱线图、小提琴图、直方图和柱状图,并结合 Plotly.js 实现丰富的交互式可视化效果。同时,详细讲解了数据聚合的‘分割-应用-组合’模式,包括分组数据、遍历分组、apply 方法及 agg 聚合操作,帮助开发者高效处理和分析结构化数据。适用于 Dnotebook、HTML 及主流前端框架的应用场景。

o1p2q3r的博客 98

POJ 3041 Asteroids 匈牙利算法

POJ 3041:http://poj.org/problem?id=3041 Asteroids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20152   Accepted: 10934 Description Bessie wants to

~不可描述~ 430

Xilinx FPGA平台GTX简易使用教程(四)GTX IP核配置教程

干货来了,GTX IP核配置,搬砖全靠它~~

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

poj 3041 Asteroids 【匈牙利算法】

题目链接:http://poj.org/problem?id=3041题意:n*n矩阵上有行星,每次只能在一行或一列放一发子弹,消灭本行或列的所有行星,求消灭所有行星的最小消耗子弹数目。解法:二分图,行为一个顶点集,列为另一顶点集。题目转化成为选择最少的一些点(x或y),使得从这些点与所有的边相邻,其实这就是最小点覆盖问题。代码:#include <stdio.h> #include <ctime>

mfcheer 737

ChatGPT辅助课题申报书研究背景部分的写作全过程指南

ChatGPT辅助课题申报书研究背景部分的写作全过程指南

智能AI让学术科研更容易 2554

使用字体解密技术爬取懂车帝二手车数据

本文介绍了一种针对懂车帝二手车平台的字体加密数据采集方案。通过抓包分析,识别出关键API接口并解析了字体加密机制,成功实现了价格等敏感数据的解密。方案采用requests库发送POST请求获取JSON数据,利用fontTools解析字体映射关系,建立加密字符到真实数字的转换算法。程序支持多页采集,提取车辆名称、价格、年份等12个维度的信息,并自动保存为Excel格式。技术亮点包括动态字体解析、健壮的数据处理和分页优化,为二手车市场分析提供了可靠的数据支持。文中特别强调数据采集的合法合规性,建议仅用于学术研究

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1309

poj3041 Asteroids

Asteroids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20174   Accepted: 10948 Description Bessie wants to navigate her spaceship through a dangerous as

樱花满地集于我心,楪舞纷飞祈愿相随 413

【Python深度学习】做深度学习训练时,如果数据集太大,无法一次性加载进GPU,应该如何做?

方法核心思想优点缺点适用场景实现复杂度小批量训练(Mini-Batch Training)与数据加载器(DataLoader)将数据集划分为小批量,每次只加载一个小批量到GPU中进行训练。- 易于实现- 是深度学习的标准做法- 支持多进程加载- 内存可能成为瓶颈- 需要调整批量大小避免内存不足适用于大部分场景低数据分片与分布式训练(Data Sharding & Distributed Training)将数据集分片,每个GPU或节点处理其中一部分数据,分布式训练。

若北辰 1141

POJ 3041 Asteroids(二分图最小点覆盖, 转化)

二分图最小点覆盖 题目意思: 有 n * n 的矩阵, 有k个小行星, 有位美女开飞船,开一枪可以消灭一行或者一列的 小行星。问,最少开多少枪, 可以消灭所以的小行星。 本题要点: 1、左部节点: n个横坐标 右部节点:n个纵坐标 n <= 500, 用邻接矩阵来存图 2、 最小点覆盖数定义: 就是对于一个图,选取最少数量的点S,使得对于所有的边,都至少有一端点是S中的点。 该题目中,小行星的坐标 (x, y) 转化为 二分图 左部的点 x 连上 右部的点y的一条边。 求出最小点覆盖数 的 s个点后,

qq_38232157的博客 241

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

poj 图相关之3041 Asteroids

poj 图相关之3041 Asteroids 第一次接触匈牙利算法

ziqi9216的博客 306

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

POJ 3041 Asteroids(最小覆盖数)

POJ 3041 Asteroids(最小覆盖数) http://poj.org/problem?id=3041 题意:        有一个N*N的网格,该网格有K个障碍物.你有一把武器,每次你使用武器可以清楚该网格特定行或列的所有障碍.问你最少需要使用多少次武器能清除网格的所有障碍物? 分析:        把网格的行1到N看出左边点集的点,网格的列号看成右边点集的点. 如果(i,j

code 3936

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

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

【POJ】3041 Asteroids 二分匹配

传送门:【POJ】3041 Asteroids

poursoul 999

Asteroids POJ - 3041(最小覆盖点 ,二分图匹配)

Asteroids POJ - 3041 题意:n*n网格,一枪可以干掉一行或一列行星,问最少开几枪。 分析:即选几个边点或列点开枪,求最小的点的个数-->即最小覆盖点,在二分图中等于最大匹配,因为每个行星都有一个行坐标和列坐标即求行坐标和列坐标的最大匹配。 代码: #include<cstdio> #include<iostream> #include&...

fighting_yifeng的博客 212

POJ 3041 Asteroids(最小点覆盖)

POJ 3041 Asteroids 题目链接 题意:一个棋盘上面放东西,要求选择最少的行列能清掉这些东西 思路:很经典的水题,行列有东西的建边,然后最小点覆盖就答案,最小点覆盖等于最大匹配 代码: #include #include #include #include using namespace std; const int N = 505; int

Remilia's 674

POJ 3041 Asteroids / UESTC 253 Asteroids(二分图最大匹配,最小点匹配)

POJ 3041 Asteroids / UESTC 253 Asteroids(二分图最大匹配,最小点匹配) Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). ...

dipinzhu4111的博客 128

POJ 3041 Asteroids题解

POJ 3041 Asteroids题解 Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). The grid contains K asteroids (1 <= K <= 1

zvzdjvnai~的博客 351

POJ 3041 Asteroids 最小点覆盖

POJ 3041 Asteroids 题意:用最少的射击来消灭图中的小行星。 关键是建图转化,建一个 横坐标到纵坐标的二分图,有障碍的点的位置上的值赋值为1,然后根据题意求的是二分图的最小点覆盖数,根据一个定理,知道最小点覆盖数=最大匹配数 AC #include&lt;stdlib.h&gt; #include&lt;iostream&gt; #include&lt;algorit...

LMengi000的博客 288

poj 3041 Asteroids

类型:最小顶点覆盖 题目:http://poj.org/problem?id=3041 来源:USACO 2005 November Gold 思路:将行号和列号分别看做不同的点,如果在行x、列y中存在asteroid,则构造边x->y,则题目要求的即是用最少的点 覆盖所有的边,即最小顶点覆盖,最小顶点覆盖 = 二分图最大匹配 // poj 3041 Asteroids // ac 12

gold_bridge 292

POJ 3041 Asteroids(匈牙利算法—最小点覆盖)

题目链接:POJ 3041 Asteroids

fobdddf的专栏 746

POJ3041 Asteroids【最小顶点覆盖问题】

Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). The grid contains K asteroids (1 <= K <= 10,000), which are conveniently located at the lattice points of the

胡小涛的博客 713

poj-3041-Asteroids -二分图的最大匹配

Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). The grid contains K asteroids (1 <= K <= 10,000), which are conveniently locate

命运在指间 669
上一篇: system函数
下一篇: POJ 1325 Machine Schedule 二分图 最小覆盖
NeighThorn
博客等级 码龄11年 20粉丝 171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值