hdu 4160(最小路径覆盖)

来源:互联网 发布:热血传奇闪避命中数据 编辑:程序博客网 时间:2024/05/19 02:18

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4160

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

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

 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 struct Node{ 7    int wi,hi,li; 8 }node[555]; 9 bool map[555][555];10 bool mark[555];11 int ly[555];12 int n;13 14 int cmp(const Node &p,const Node &q){15    if(p.wi!=q.wi)return p.wi<q.wi;16    else if(p.li!=q.li)return p.li<q.li;17    return p.hi<q.hi;18 }19 20 int dfs(int u)21 {22    for(int v=0;v<n;v++){23       if(map[u][v]&&!mark[v]){24          mark[v]=true;25          if(ly[v]==-1||dfs(ly[v])){26             ly[v]=u;27             return 1;28          }29       }30    }31    return 0;32 }33 34 int MaxMatch()35 {36    int res=0;37    memset(ly,-1,sizeof(ly));38    for(int i=0;i<n;i++){39       memset(mark,false,sizeof(mark));40       res+=dfs(i);41    }42    return res;43 }44 45 int main(){46  //  freopen("1.txt","r",stdin);47    while(scanf("%d",&n),n){48       for(int i=0;i<n;i++){49          scanf("%d%d%d",&node[i].wi,&node[i].li,&node[i].hi);50       }51       sort(node,node+n,cmp);52       memset(map,false,sizeof(map));53       for(int i=0;i<n;i++){54          for(int j=i+1;j<n;j++){55             if(node[i].wi<node[j].wi&&node[i].li<node[j].li&&node[i].hi<node[j].hi)56                map[i][j]=true;57          }58       }59       int ans=MaxMatch();60       printf("%d\n",n-ans);61    }62    return 0;63 }
View Code

 

 

0 0
原创粉丝点击