[置顶] 白话最小边覆盖总结--附加 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 ...
随机推荐
- Linux crontab 命令详解(含配置文件路径)
编辑/etc/crontab 文件配置cron cron 服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用cron服 ...
- yii 删除内容时增加ajax提示
环境 : 后台有新闻分类和新闻的文章,在分类下有文章存在的时候,不想用户删除分类 代码 controller public function actionDelete($id) { $data = C ...
- IO-文件 File 复制 读写 总结
一定要注意: 传入的参数,应该是包含文件名的完整路径名,不能把一个文件复制到[文件夹]中,因为[文件夹]本身是不能有输入输出流的,只能复制到一个[文件]中,否则会报异常. 以字节流读写的三种方式 pu ...
- Asp.net 回车默认按钮
<head> <script type="text/javascript"> function OnKey() { if (ev ...
- MySql中的时间类型datetime,timestamp,date,year比较
MySQL日期类型.日期格式.存储空间.日期范围比较.日期类型 存储空间 日期格式 日期范围------------ --------- ...
- 武汉科技大学ACM :1002: 零起点学算法66——反话连篇
Problem Description 把输入的字符按照反着顺序输出 Input 多组测试数据 每组一行(每组数据不超过200个字符) Output 按照输入的顺序反着输出各个字符 Sample I ...
- The partial sum problem
算法:搜索 描述 One day,Tom's girlfriend give him an array A which contains N integers and asked him:Can yo ...
- c++虚函数的学习
1.虚函数 #include<iostream.h> class Base { public: void print() { cout<<"Base"< ...
- 记一次MySQl 安装1067错误
1.今天阿里云windows server 2008 r2服务器上安装mysql,配置完发现无法启动mysql服务(并发设置的是500),查询windows日志提示 Unknown/unsupport ...
- jQuery 分割按钮(Split Button)
代码写多了,有些使用过的方法和技巧会一时半会想不起来,平日记录下来,方便自己和有需要的人日后查阅. <html> <head> <style type="tex ...