盒子 | ||||||
| ||||||
Description | ||||||
Tang长老带着集训队旅游结束后回到了实验室,还带回了好多的纪念品,实验室放满了各种物品的盒子,Tang长老说大家要注意形象,遂要求大家把盒子收拾好。实验室本来地方就比较小,所以大家想尽量腾出点地方来,还好盒子都是立方体的,一些盒子可以装在另一些盒子内部,于是大家想知道如果把一些盒子装在另一些盒子内部的话最少可以保留多少盒子露在外面,而且需要注意的是,当一个大的盒子装入一个小的盒子的时候,大的盒子的容量就会变为小的盒子的体积,即不能有超过两个盒子并列放在一个盒子内部,但是允许层层嵌套着放。
| ||||||
Input | ||||||
Line 1: 盒子的总数 N(2 ≤ N ≤ 500),盒子的大小关系数 M。 Line 2...M+1:两个整数 A,B,表示盒子 A 可以放在盒子 B 内部。 | ||||||
Output | ||||||
Line 1: 一个整数,表示露在外面的盒子的最少个数。 | ||||||
Sample Input | ||||||
3 2 1 2 2 3 | ||||||
Sample Output | ||||||
1 | ||||||
Author | ||||||
wind |
2 最优匹配
最优匹配又称为带权最大匹配,是指在带有权值边的二分图中,求一个匹配使得匹配边上的权值和最大。一般X和Y集合顶点个数相同,最优匹配也是一个完备匹配,即每个顶点都被匹配。如果个数不相等,可以通过补点加0边实现转化。一般使用KM算法解决该问题。
3
二分图的最小覆盖分为最小顶点覆盖和最小路径覆盖:
①最小顶点覆盖是指最少的顶点数使得二分图G中的每条边都至少与其中一个点相关联,二分图的最小顶点覆盖数=二分图的最大匹配数;
②最小路径覆盖也称为最小边覆盖,是指用尽量少的不相交简单路径覆盖二分图中的所有顶点。二分图的最小路径覆盖数=|V|-二分图的最大匹配数;
4
二分图匹配问题。。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m ;
int match[1003][1003];
bool vis[10003];
int pre[1003];
bool dfs(int x)
{
for(int i = 1 ; i <= n; i++)
{
if( match[x][i] == 1&& !vis[i])
{
vis[i]=true;
int tmp=pre[i];
if(tmp==-1||dfs(tmp))
{
pre[i]=x;
return true;
}
}
}
return false;
}
int solve()
{
int res=0;
for(int i=1;i<=n;i++)
pre[i]=-1;
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
res++;
}
return res;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
int a , b;
for(int i = 0 ;i < m; i++)
{
scanf("%d %d",&a,&b);
match[a][b]=1;
}
printf("%d\n",solve());
}
}