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