hdu 4160 (Dolls)二分图的最小路径覆盖
关于二分图,让人很头疼啊!归结为一句话,就是看不出来题目是二分图的问题。
也许是对二分图不太熟悉吧!需要多练习!
题目大意:给出n个箱子,每个箱子的参数为长,宽,高;(a,b,c);当且仅当箱子s1,s2满足a1<a2,b1<b2,c3<c3时箱子s1可以装入s2中,每个箱子只可以装入一个箱子(装入的箱子中可以装有箱子),问这n个箱子进行互装后,最少剩下几个箱子?
刚开始尝尽所有知道最有解的方法,排序、动态规划什么的都用上,结果都是wa。
无奈google之,发现是二分图的最小路径覆盖。
【二分图的最小路径覆盖】=总的节点数n-最大匹配数。
所以核心仍是求最大匹配数。

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 #define N 555 6 int link[N][N]; 7 int mark[N]; 8 int visited[N]; 9 struct node{ 10 int a,b,c; 11 }s[N]; 12 int n; 13 int dfs(int x) 14 { 15 int i; 16 for(i=1;i<=n;i++) 17 { 18 if(link[x][i]==0) continue; 19 if(visited[i]==1) continue; 20 { 21 visited[i]=1; 22 if(mark[i]==0||dfs(mark[i])==1) 23 { 24 mark[i]=x; 25 return 1; 26 } 27 } 28 } 29 return 0; 30 } 31 32 33 int main() 34 { 35 36 while(cin>>n) 37 { 38 if(n==0) break; 39 int i; 40 memset(link,0,sizeof(link)); 41 memset(s,0,sizeof(s)); 42 memset(mark,0,sizeof(mark)); 43 for(i=1;i<=n;i++) 44 cin>>s[i].a>>s[i].b>>s[i].c; 45 int j; 46 for(i=1;i<=n;i++) 47 for(j=1;j<=n;j++) 48 { 49 if(s[i].a<s[j].a&&s[i].b<s[j].b&&s[i].c<s[j].c) 50 link[i][j]=1; 51 } 52 int num=0; 53 for(i=1;i<=n;i++) 54 { 55 memset(visited,0,sizeof(visited)); 56 if(dfs(i)==1) 57 num++; 58 } 59 printf("%d\n",n-num); 60 } 61 return 0; 62 } 63 64
分类:
graph theory
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?