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连边,然后就是求最大匹配。
最小路径覆盖=顶点数-最大匹配。
View Code
思路:最小路径覆盖,如果满足条件: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
相关文章推荐
- HDU 4160 最小路径覆盖 = 顶点数 - 最大匹配数 二分匹配
- 最小路径覆盖&&http://acm.hdu.edu.cn/showproblem.php?pid=4160
- HDU 4160 Dolls(DAG最小路径覆盖)
- HDU 4160 Dolls (最小路径覆盖=顶点数-最大匹配数)
- HDU-4160 Doll 最小路径覆盖
- HDU - 4160 最小路径覆盖
- 【HDU】4160 Dolls 最小路径覆盖
- hdu 4160 Dolls 二分图最小路径覆盖
- hdu 4160(最小路径覆盖)
- HDU 4160 Dolls(二分图匹配+匈牙利算法+最小路径覆盖)
- HDU 4160 Dolls 【最小路径覆盖】
- HDU 4160 Dolls(DAG最小路径覆盖)
- hdu 4160 二分图最小路径覆盖
- 【最小路径覆盖】HDU 4160
- hdu 4160 Dolls【最小路径覆盖----二分匹配】
- HDU 4160 — Dolls 最小路径覆盖
- hdu 4160 (Dolls)二分图的最小路径覆盖
- HDU 4160 Dolls 最小路径覆盖
- HDU 4160 Dolls(DAG最小路径覆盖)
- [hdu 4160] Dolls(最小路径覆盖)