您的位置:首页 > 其它

hdu 4160 二分图最小路径覆盖

2012-12-10 17:06 435 查看
最小路径覆盖=点数—最大匹配;

可以理解为如果匹配为0,则路径=点数。

每增加一次匹配则点数减1,,所以最小路径覆盖=点数—最大匹配;

#include<stdio.h>
#include<string.h>
int m,n,u,use[503],st[503][503],link[503];
struct ss
{
int c,k,g;
}s[503];
int find(int v)
{
int i,j;
for(i=1;i<=m;i++)
{
if(st[v][i]&&!use[i])
{
use[i]=1;
if(!link[i]||find(link[i]))
{
link[i]=v;
return 1;
}
}
}
return 0;
}
int max()
{
int i,ans=0;
memset(link,0,sizeof(link));
for(i=1;i<=m;i++)
{
memset(use,0,sizeof(use));
if(find(i))
ans++;
}
return ans;
}
int main()
{
while(~scanf("%d",&u)&&u)
{

int i,j,x,y,z;
m=0;
memset(st,0,sizeof(st));
for(i=1;i<=u;i++)
{
m++;
scanf("%d%d%d",&x,&y,&z);
s[m].c=x;
s[m].k=y;
s[m].g=z;
}
for(i=1;i<=u;i++)
for(j=i+1;j<=u;j++)
{
if(s[i].c<s[j].c&&s[i].k<s[j].k&&s[i].g<s[j].g)
st[i][j]=1;
if(s[i].c>s[j].c&&s[i].k>s[j].k&&s[i].g>s[j].g)
st[j][i]=1;
}
int zs;
zs=max();
printf("%d\n",u-zs);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: