本文共 1686 字,大约阅读时间需要 5 分钟。
35 4 827 10 10100 32 52331 2 12 1 11 1 241 1 12 3 23 2 24 4 40
132
#include#include #define MAXN 505int g[MAXN][MAXN];struct Info{ int x,y,z;}info[MAXN];int linker[MAXN];bool vis[MAXN];int uN, vN;bool ok(int i, int j){ return (info[i].x > info[j].x) && (info[i].y > info[j].y) && (info[i].z > info[j].z);}bool dfs(int root){ int i; for(i = 0; i < vN; i++) { if(g[root][i]&&!vis[i]) { vis[i] = 1; if(linker[i]==-1) { linker[i] = root; return 1; } else { if(dfs(linker[i])) { linker[i] = root; return 1; } } } } return 0;}int main(){ int N, i, j, ans; while(scanf("%d",&N) && N) { for(i = 0; i < N; i++) scanf("%d%d%d", &info[i].x, &info[i].y, &info[i].z); memset(g, 0, sizeof(g)); for(i = 0; i < N; i++) for(j = 0; j < N; j++) { if(ok(i, j)) g[i][j] = 1; } /**匈牙利匹配算法**/ ans = uN = vN = N;//uN:左边的点,vN右边的点,ans值 (即最小覆盖点)=N - 最大匹配 memset(linker, -1, sizeof(linker)); for(i = 0; i < uN; i++) { memset(vis, 0, sizeof(vis)); if(dfs(i)) ans--; } printf("%d\n", ans); } return 0;}
转载地址:http://weuvi.baihongyu.com/