您的位置:首页 > 其它

hdu 4160 (Dolls)二分图的最小路径覆盖

2013-04-21 21:11 337 查看
关于二分图,让人很头疼啊!归结为一句话,就是看不出来题目是二分图的问题。

也许是对二分图不太熟悉吧!需要多练习!

题目大意:给出n个箱子,每个箱子的参数为长,宽,高;(a,b,c);当且仅当箱子s1,s2满足a1<a2,b1<b2,c3<c3时箱子s1可以装入s2中,每个箱子只可以装入一个箱子(装入的箱子中可以装有箱子),问这n个箱子进行互装后,最少剩下几个箱子?

刚开始尝尽所有知道最有解的方法,排序、动态规划什么的都用上,结果都是wa。

无奈google之,发现是二分图的最小路径覆盖。

【二分图的最小路径覆盖】=总的节点数n-最大匹配数。

所以核心仍是求最大匹配数。

View Code

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 555
int link

;
int mark
;
int visited
;
struct node{
int a,b,c;
}s
;
int n;
int dfs(int x)
{
int i;
for(i=1;i<=n;i++)
{
if(link[x][i]==0)  continue;
if(visited[i]==1)  continue;
{
visited[i]=1;
if(mark[i]==0||dfs(mark[i])==1)
{
mark[i]=x;
return 1;
}
}
}
return 0;
}

int main()
{

while(cin>>n)
{
if(n==0) break;
int i;
memset(link,0,sizeof(link));
memset(s,0,sizeof(s));
memset(mark,0,sizeof(mark));
for(i=1;i<=n;i++)
cin>>s[i].a>>s[i].b>>s[i].c;
int j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(s[i].a<s[j].a&&s[i].b<s[j].b&&s[i].c<s[j].c)
link[i][j]=1;
}
int num=0;
for(i=1;i<=n;i++)
{
memset(visited,0,sizeof(visited));
if(dfs(i)==1)
num++;
}
printf("%d\n",n-num);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: