#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <stack>
#include <vector>
#include <map>
using namespace std;
int n,wanum;
const int Max=550;
vector<int>group[Max];//有链接的
int att[Max];//是否已经配对
int fa[Max];//当前配对节点
struct node{
//int w,l,h;根据题目填写节点信息
}wawa[Max];
int xyl(int u){
for(int i=0;i<group[u].size();i++){
int v=group[u][i];
if(!att[v]){
att[v]=1;
if(fa[v]==0||xyl(fa[v])){//两个条件分别为:还未匹配||或者可以换对象匹配(后者就是在找增广路)
fa[v]=u;
return 1;
}
}
}
return 0;
}
void build(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
/*if(wawa[i].w<wawa[j].w&&wawa[i].l<wawa[j].l&&wawa[i].h<wawa[j].h){
group[i].push_back(j);//根据题目链接节点
}*/
}
}
}
int main(){
while(1){
scanf("%d",&n);
if(!n){
break;
}
for(int i=1;i<=n;i++){
group[i].clear();
}
for(int i=1;i<=n;i++){
//scanf("%d%d%d",&wawa[i].w,&wawa[i].l,&wawa[i].h);根据题目存点
}//存点
build();//建图
int ans=0;
memset(fa,0,sizeof(fa));
for(int i=1;i<=n;i++){
memset(att,0,sizeof(att));
if(xyl(i)){//匈牙利算法需要主函数辅助完成
ans++;
}
}
printf("%d\n",n-ans);
}
return 0;
}
模板积累——匈牙利算法
最新推荐文章于 2024-03-11 00:04:05 发布