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
也许是对二分图不太熟悉吧!需要多练习!
题目大意:给出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; }
相关文章推荐
- hdu 4160 Dolls 二分图最小路径覆盖
- HDU 4160 Dolls 最小路径覆盖
- hdu 4160 Dolls【最小路径覆盖----二分匹配】
- HDU 4160 Dolls 【最小路径覆盖】
- HDU 4160 Dolls(DAG最小路径覆盖)
- HDU 4160 — Dolls 最小路径覆盖
- hdu 4160 Dolls--最小点集覆盖=V-二分图最大匹配
- HDU 4160 Dolls(DAG最小路径覆盖)
- HDU 4160 Dolls (最小路径覆盖=顶点数-最大匹配数)
- HDU 4160 Dolls(DAG最小路径覆盖)
- hdu 4160 二分图最小路径覆盖
- [hdu 4160] Dolls(最小路径覆盖)
- HDU 4160 Dolls(二分图匹配+匈牙利算法+最小路径覆盖)
- 【HDU】4160 Dolls 最小路径覆盖
- HDU 1151 Air Raid(匈牙利算法 二分图的最小路径覆盖 )
- HDU - 4160 最小路径覆盖
- hdu-1350-最小路径覆盖(二分图)
- 【最小路径覆盖】HDU 4160
- HDU 1151 二分图的DAG最小路径覆盖 解题报告
- hdu 4160 dolls 最少路径覆盖