HDU 1151 Air Raid( 最小路径覆盖 )
2013-05-08 11:17
211 查看
这道题是很经典的最小路径覆盖问题。最小路径覆盖,是指在有向无环图中,选择最少的点作为起点,使得遍历图中所有的点有且仅有一次。因此,每个单独的顶点可以看做是一条路径。最小路径覆盖=N-原图的最大二分匹配数。
代码:
#include <cstdio>
#include <cstring>
const int N = 150;
int n, m;
int bmap
, cy
;
bool vis
;
bool dfs( int u )
{
for( int i = 1; i <= n; ++i ) if ( bmap[u][i] && !vis[i] ) {
vis[i] = 1;
if ( cy[i] == -1 || dfs( cy[i] )) {
cy[i] = u;
return 1;
}
}
return 0;
}
int match()
{
int res = 0;
memset( cy, -1, sizeof(cy));
for ( int i = 1; i <= n; ++i ) {
memset( vis, 0, sizeof(vis));
if ( dfs(i) ) res++;
}
return res;
}
int main()
{
int T;
scanf("%d", &T);
while ( T-- ) {
scanf("%d%d", &n, &m);
memset(bmap, 0, sizeof(bmap));
while ( m-- ) {
int u, v;
scanf("%d%d", &u, &v);
bmap[u][v] = 1;
}
printf("%d\n", n - match());
}
}
代码:
#include <cstdio>
#include <cstring>
const int N = 150;
int n, m;
int bmap
, cy
;
bool vis
;
bool dfs( int u )
{
for( int i = 1; i <= n; ++i ) if ( bmap[u][i] && !vis[i] ) {
vis[i] = 1;
if ( cy[i] == -1 || dfs( cy[i] )) {
cy[i] = u;
return 1;
}
}
return 0;
}
int match()
{
int res = 0;
memset( cy, -1, sizeof(cy));
for ( int i = 1; i <= n; ++i ) {
memset( vis, 0, sizeof(vis));
if ( dfs(i) ) res++;
}
return res;
}
int main()
{
int T;
scanf("%d", &T);
while ( T-- ) {
scanf("%d%d", &n, &m);
memset(bmap, 0, sizeof(bmap));
while ( m-- ) {
int u, v;
scanf("%d%d", &u, &v);
bmap[u][v] = 1;
}
printf("%d\n", n - match());
}
}
相关文章推荐
- hdu 1151 Air Raid (二分匹配,最小路径覆盖)
- [hdu 1151] Air Raid(最小路径覆盖)
- hdu 1151 Air Raid(最小路径覆盖)
- hdu 1151 Air Raid ( 最小路径覆盖 )
- hdu 1151 Air Raid(二分图最小路径覆盖)
- hdu 1151 Air Raid最小路径覆盖
- HDU 1151 Air Raid 最小路径覆盖
- Air Raid HDU - 1151 最小路径覆盖
- HDU 1151 Air Raid(DAG上的最小路径覆盖)
- HDU 1151 Air Raid(最小路径覆盖)
- hdu 1151 Air Raid(最小路径覆盖)
- hdu 1151 Air Raid 最小路径覆盖(最大匹配)
- HDU 1151 Air Raid(最小路径覆盖 = 顶点数 - 最大匹配数)
- 【二分图匹配(最小路径覆盖)】hdu 1151 Air Raid
- HDU 1151 Air Raid(最小路径覆盖)
- HDU 1151 Air Raid (最小路径覆盖入门级)
- hdu 1151 Air Raid 最小路径覆盖
- hdu 1151 Air Raid 【DAG最小路径覆盖】
- hdu 1151 Air Raid【最小路径覆盖】
- HDU-1151 Air Raid 最小简单路径覆盖