[置顶] 白话最小边覆盖总结--附加 hdu1151结题报告
刚开始看到这个题目的时候就觉得想法很明了,就是不知道如何去匹配...
去网上看了不少人的解题报告,但是对于刚接触“最小边覆盖”的我来说....还是很困难滴....于是自己又开始一如以往学习“最大独立集”、“最小点覆盖的”的思考方式啦:在了解一个看似高深的知识点之前,粗略了解这是个什么东东,那么看概念也会更好理解,(希望此博客在自己以后回头来看会一目明了,也对刚接触“最小边覆盖”的人有帮助(万分感到荣幸)):
首先把题目的第一个案例图形化(第一,图形好理解,第二,很多人看到文字就烦啦。第三,图论不画图怎么可以捏),我们把交叉路看成点,街道看成边,就如下图:
要求选择最少的伞兵降落在某些交叉口,使他们走完所有的交叉口,(注意是单向边)从图中很容易选择,我们在二号交叉口降落一个走到3再走到4,然后在1好交叉口降落一个,总共两个就可以访问所有的交叉口,我们就可以这样看:把3号街道和1号街道看做一条边,把2.3.4号交叉点都覆盖啦:如图
这样就对“最小边覆盖”有了那么点粗俗的理解啦
接下来是解决这个问题,用匈牙利匹配:因为刚开始接触二分匹配,我就想用街道(简化为点)去和交叉口匹配:(谁知道...如图)
可想而知..完全不知道怎么匹配....
接着就看看最小边覆盖和二分匹配的关系吧:(如果觉得看文字概念还是很烦..可以看下面的图形说明,不过结合文字和图形更有助理解)(摘自百度百科)
二分图匹配的关系(必须是没有圈的有向图):
公式:最小路径覆盖=|P|-最大匹配数;可以这么来理解;
让交叉点和交叉点点去匹配
最小边覆盖=|P|-最大匹配这个公式就比较明了啦....
// 0MS 244K
#include<stdio.h>
#include<string.h> #define MAX 121 int no_in,no_st;//交叉路的数量,街道数量
bool map[MAX][MAX];//map[i][j]表示i号交叉口有一条街道可以达到j号交叉口
int link[MAX];
bool useif[MAX]; bool dfs(int t)
{
for(int i=1;i<=no_in;i++)
{
if(!useif[i] && map[t][i])
{
useif[i]=true;
if(link[i]==-1 || dfs(link[i]))
{
link[i]=t;return true;
}
}
}
return false;
} int match()
{
int sum=0;
memset(link,-1,sizeof(link));
for(int i=1;i<=no_in;i++)
{
memset(useif,false,sizeof(useif));
if(dfs(i))
sum++;
}
return sum;
} int main()
{
int T;
int a,b;
scanf("%d",&T);
while(T--)
{
memset(map,0,sizeof(map));
scanf("%d%d",&no_in,&no_st);
for(int i=1;i<=no_st;i++)
{
scanf("%d%d",&a,&b);
map[a][b]=1;//注意是单项路
}
printf("%d\n",no_in-match());
}
return 0;
}
[置顶] 白话最小边覆盖总结--附加 hdu1151结题报告的更多相关文章
- [置顶] 白话二分匹配之最大匹配+附上hdu2063解题报告
最近开始学习图论的二分匹配,关于最大匹配做一次小总结,希望自己后面回头来看一目明了,也对刚接触的人有帮助: ps:开始有的文字很多....对于很多人来说一看到文字就烦啦...不过这个总结是针对匈牙利算 ...
- win8.1系统下,点击一个窗口,【当前活动窗口】该窗口无法置顶
两个或多个窗口同时显示在桌面的时候,点击下一层的窗口,无法置顶显示,无论怎么点击,还是隐藏在原置顶窗口的后面,只能手动把原置顶窗口最小化后,才能看到.例如,A窗口现在置顶,B窗口在A的后面,露出来一部 ...
- wpf 窗口最小化后,触发某事件弹出最小化窗口并置顶
//如果窗口最小化了弹出并置顶----事件触发调用 ShowWindowAsync(new System.Windows.Interop.WindowInteropHelper(CommonHelpe ...
- Qt 窗口操作函数(置顶、全屏,最大化最小化按钮设置等)
一.窗口置顶 与 取消置顶 void MainWindow::on_windowTopButton_clicked() { if (m_flags == NULL) { m_flags = windo ...
- HDU1151:Air Raid(最小边覆盖)
Air Raid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- 将窗口置顶的方法:SetWindowPos、AttachThreadInput、SwitchToThisWindow
将窗口置顶的方法:SetWindowPos.AttachThreadInput.SwitchToThisWindow [转]http://hi.baidu.com/neil_danky/item/f9 ...
- [Winform]检测exe是否已经运行,并将其置顶
摘要 在很多pc应用中,基本上都需要有这样的判断,保证在一个终端只运行一个winform的client.并且如果最小化了,用户再次双击桌面图标的时候,将client置顶显示. 解决方案 需要使用win ...
- PKU 3020 Antenna Placement(拆点+最小边覆盖)(最大匹配)
题目大意:原题链接 一个矩形中,有N个城市’*’,现在这n个城市都要覆盖无线,若放置一个基站,那么它至多可以覆盖相邻的两个城市.问至少放置多少个基站才能使得所有的城市都覆盖无线? 提示:看清楚题目,' ...
- [置顶] Android开发笔记(成长轨迹)
分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...
随机推荐
- Pascal's Triangle II
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3 ...
- C# winform 加载网页 模拟键盘输入自动接入访问网络
声明: 本文原创,首发于博客园 http://www.cnblogs.com/EasyInvoice/p/6070563.html 转载请注明出处. 背景: 由于所在办公室网络限制,笔者每天都使用网络 ...
- Winform Textbox实现滚动条始终在最下面
在用textbox时,实现一些信息追加时,要使滚动条始终呆在最下面的实现方法. 以textbox1为例,事件TextChanged中执行以下代码即可 private void textBox1_Tex ...
- 3_Linux_文件搜索指令
.3文件搜索命令 1)which 查找一个命令所在的路径 whereis 提供命令的帮助文件的信息 whatis 显示命令的概要信息whatis ls which提供命令的别名信息 2)find,基本 ...
- 2015 UESTC Winter Training #8【The 2011 Rocky Mountain Regional Contest】
2015 UESTC Winter Training #8 The 2011 Rocky Mountain Regional Contest Regionals 2011 >> North ...
- webform 简单的服务器控件。
服务器基本控件: 1 textbox text:获取或设置文本 textmode:单行/多行/密码... wrap:是否换行 rows:行数 ...
- JavaScript基础(二)
一.外部引用语法<script src="script.js"></script> 二.在页面中的位置 1.我们可以将JavaScript代码放在html文 ...
- springMVC如何判断入参是默认参数还是请求传过来的参数?
springMVC如何判断入参是默认参数还是请求传过来的参数?
- CentOS目录结构详解
CentOS是文件管理系统,在CentOS中所有的程序都以文件形式存储.初学CentOS的朋友需要了解各个挂载点 目录的结构和作用.这样才能更好的去管理系统. CentOS的目录大体上可分为四类:管理 ...
- SQL 2008R2 日期转换
--SQL CONVERT日期转换 print GETDATE() --相同 Select CONVERT(varchar(100), GETDATE(), 0) AS NDateTime --: 0 ...