题目:http://poj.org/problem?id=1325

二分图求最大匹配,即为最小点覆盖;

一开始我写得较麻烦,求出最大匹配又去搜增广路,打标记求最小点覆盖;

然而两种方法都没写“ans=0”,WA了好几次,心力交瘁时才发现,改后即A,心力交瘁。

代码1如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,k,pre1[305],pre2[305],head[305],ct,ans;
bool vis[305];
struct N{
int to,next;
}edge[3005];
void add(int x,int y)
{
ct++;
edge[ct].to=y;
edge[ct].next=head[x];
head[x]=ct;
}
bool dfs(int b)
{
for(int i=head[b];i;i=edge[i].next)
{
int a=edge[i].to;
if(vis[a])continue;
vis[a]=1;
if(!pre1[a]||dfs(pre1[a]))
{
pre1[a]=b;
pre2[b]=a;
return 1;
}
}
return 0;
}
bool dfs2(int b)
{
vis[b]=1;
for(int i=head[b];i;i=edge[i].next)
{
int a=edge[i].to;
if(vis[a])continue;
vis[a]=1;
if(!pre1[a]||dfs2(pre1[a]))
{
pre1[a]=b;
pre2[b]=a;
return 1;
}
}
return 0;
}
int main()
{
while(1)
{
ct=0;ans=0;//!
memset(pre1,0,sizeof pre1);
memset(pre2,0,sizeof pre2);
memset(head,0,sizeof head);
scanf("%d",&n);
if(!n)return 0;
scanf("%d%d",&m,&k);
int d,a,b;
for(int i=1;i<=k;i++)
{
scanf("%d%d%d",&d,&a,&b);
if(a*b==0)continue;
add(a+100,b);
add(b,a+100);
}
for(int i=1;i<m;i++)//最大匹配
if(!pre2[i])
{
memset(vis,0,sizeof vis);
vis[i]=1;//
dfs(i);
}
memset(vis,0,sizeof vis);
for(int i=1;i<m;i++)
if(!pre2[i])
dfs2(i);
for(int i=1;i<m;i++)
if(!vis[i])ans++;
for(int i=101;i<n+100;i++)
if(vis[i])ans++;
printf("%d\n",ans);
}
}

代码2如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,k,pre[305],head[305],ct,ans;
bool vis[305];
struct N{
int to,next;
}edge[3005];
void add(int x,int y)
{
ct++;
edge[ct].to=y;
edge[ct].next=head[x];
head[x]=ct;
}
bool dfs(int b)
{
vis[b]=1;
for(int i=head[b];i;i=edge[i].next)
{
int a=edge[i].to;
if(vis[a])continue;
vis[a]=1;
if(!pre[a]||dfs(pre[a]))
{
pre[a]=b;
pre[b]=a;
return 1;
}
}
return 0;
} int main()
{
while(1)
{
ct=0;ans=0;//
memset(pre,0,sizeof pre);
memset(head,0,sizeof head);
scanf("%d",&n);
if(!n)return 0;
scanf("%d%d",&m,&k);
int d,a,b;
for(int i=1;i<=k;i++)
{
scanf("%d%d%d",&d,&a,&b);
if(a*b==0)continue;
add(a+100,b);
add(b,a+100);
}
for(int i=1;i<m;i++)//最大匹配
if(!pre[i])
{
memset(vis,0,sizeof vis);
if(dfs(i))ans++;
}
printf("%d\n",ans);
}
}

  

poj1325机器工作——二分图最小点覆盖的更多相关文章

  1. [poj1325] Machine Schedule (二分图最小点覆盖)

    传送门 Description As we all know, machine scheduling is a very classical problem in computer science a ...

  2. POJ1325 Machine Schedule(二分图最小点覆盖集)

    最小点覆盖集就是在一个有向图中选出最少的点集,使其覆盖所有的边. 二分图最小点覆盖集=二分图最大匹配(二分图最大边独立集) 这题A机器的n种模式作为X部的点,B机器的m种模式作为Y部的点: 每个任务就 ...

  3. UVA1194 Machine Schedule[二分图最小点覆盖]

    题意翻译 有两台机器 A,B 分别有 n,m 种模式. 现在有 k 个任务.对于每个任务 i ,给定两个整数$ a_i\(和\) b_i$,表示如果该任务在 A上执行,需要设置模式为 \(a_i\): ...

  4. POJ2226 Muddy Fields(二分图最小点覆盖集)

    题目给张R×C的地图,地图上*表示泥地..表示草地,问最少要几块宽1长任意木板才能盖住所有泥地,木板可以重合但不能盖住草地. 把所有行和列连续的泥地(可以放一块木板铺满的)看作点且行和列连续泥地分别作 ...

  5. hihoCoder #1127:二分图最小点覆盖和最大独立集

    题目大意:求二分图最小点覆盖和最大独立集. 题目分析:如果选中一个点,那么与这个点相连的所有边都被覆盖,使所有边都被覆盖的最小点集称为最小点覆盖,它等于最大匹配:任意两个点之间都没有边相连的最大点集称 ...

  6. [POJ] 2226 Muddy Fields(二分图最小点覆盖)

    题目地址:http://poj.org/problem?id=2226 二分图的题目关键在于建图.因为“*”的地方只有两种木板覆盖方式:水平或竖直,所以运用这种方式进行二分.首先按行排列,算出每个&q ...

  7. 二分图 最小点覆盖 poj 3041

    题目链接:Asteroids - POJ 3041 - Virtual Judge  https://vjudge.net/problem/POJ-3041 第一行输入一个n和一个m表示在n*n的网格 ...

  8. HihoCoder1127 二分图三·二分图最小点覆盖和最大独立集

    二分图三·二分图最小点覆盖和最大独立集 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上次安排完相亲之后又过了挺长时间,大家好像都差不多见过面了.不过相亲这个事不是说 ...

  9. 四川第七届 D Vertex Cover(二分图最小点覆盖,二分匹配模板)

    Vertex Cover frog has a graph with nn vertices v(1),v(2),…,v(n)v(1),v(2),…,v(n) and mm edges (v(a1), ...

随机推荐

  1. andorid中发送短信页面以及邮件发送

    跳转到发送短信页面 Uri smsToUri = Uri.parse("smsto://10086"); Intent mIntent = new Intent( android. ...

  2. Double类parseDouble()和valueOf()方法的区别

    数字类型的String字符串转换为浮点数通常采用parseDouble()和valueOf()方法, 两者主要是存在以下两点区别. 区别一:参数区别Double.parseDouble(java.la ...

  3. 【BZOJ】1003 Cards

    [解析]Burnside引理+背包dp+乘法逆元 [Analysis] 这道题卡了好久,就是没想懂置换跟着色是不一样的. 依据burnside引理.在一个置换群作用下不等价类的个数为每一个置换作用下不 ...

  4. Fragment 懒加载

    我们在遇到Activity嵌套Fragment的时候经常会遇到多个Fragment页面同时加载数据,一开始的时候就初始化很多页面,有的甚至进入页面的时候,会造成缓慢的现象,下面我们就针对这个问题做一下 ...

  5. 【BZOJ1146】[CTSC2008]网络管理Network 树状数组+DFS序+主席树

    [BZOJ1146][CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工 ...

  6. Java for LeetCode 083 Remove Duplicates from Sorted List

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  7. STemWin显示汉字 — SD卡外挂XBF字库

    转载注明出处  方法来自安福莱教程 1: 使用emWin自带小工具生成字库 (1)启动软件 选择4位抗锯齿 (2)根据需求选择字体类型和字体大小 (3)另存为XBF格式 2: 创建XBF字体 #inc ...

  8. mysql错误:[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated

    今天迁移django数据库的时候,跑程序的时候出现这样的错误: [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY cla ...

  9. http://blog.csdn.net/renfufei/article/details/37725057/

    版权声明:本文为博主原创文章,未经博主允许不得转载. 原创:http://blog.csdn.net/renfufei/article/details/37725057/ 说明: 首先,你需要注册一个 ...

  10. Python —— 批量替换指定目录下的所有文件中指定字符串

    参考:http://blog.csdn.net/zcwfengbingdongguke/article/details/13951527 代码: #!/usr/bin/python import os ...