您的位置:首页 > 其它

hdu 4160(最小路径覆盖)

2013-06-06 22:47 465 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4160

思路:最小路径覆盖,如果满足条件:wi < wj , li < lj , and hi < hj,那么i->j连边,然后就是求最大匹配。

最小路径覆盖=顶点数-最大匹配。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node{
int wi,hi,li;
}node[555];
bool map[555][555];
bool mark[555];
int ly[555];
int n;

int cmp(const Node &p,const Node &q){
if(p.wi!=q.wi)return p.wi<q.wi;
else if(p.li!=q.li)return p.li<q.li;
return p.hi<q.hi;
}

int dfs(int u)
{
for(int v=0;v<n;v++){
if(map[u][v]&&!mark[v]){
mark[v]=true;
if(ly[v]==-1||dfs(ly[v])){
ly[v]=u;
return 1;
}
}
}
return 0;
}

int MaxMatch()
{
int res=0;
memset(ly,-1,sizeof(ly));
for(int i=0;i<n;i++){
memset(mark,false,sizeof(mark));
res+=dfs(i);
}
return res;
}

int main(){
//  freopen("1.txt","r",stdin);
while(scanf("%d",&n),n){
for(int i=0;i<n;i++){
scanf("%d%d%d",&node[i].wi,&node[i].li,&node[i].hi);
}
sort(node,node+n,cmp);
memset(map,false,sizeof(map));
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(node[i].wi<node[j].wi&&node[i].li<node[j].li&&node[i].hi<node[j].hi)
map[i][j]=true;
}
}
int ans=MaxMatch();
printf("%d\n",n-ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: