hdu 1669(二分+多重匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1669
思路:由于要求minimize the size of the largest group,由此我们想到二分枚举,然后每一次求一下多重匹配就可以了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 #define MAXN 1010 8 #define MAXM 555 9 vector<int>vet[MAXN]; 10 bool map[MAXN][MAXN]; 11 int Link[MAXM];//i当前的匹配数 12 int vLink[MAXM][MAXN];//与i匹配的第j个匹配的数k 13 bool mark[MAXM];//标记已匹配的 14 int n,m,limit,ans; 15 16 bool dfs(int u) 17 { 18 for(int i=0;i<vet[u].size();i++){ 19 int v=vet[u][i]; 20 if(!mark[v]){ 21 mark[v]=true; 22 if(Link[v]<limit){ 23 vLink[v][Link[v]]=u; 24 Link[v]++; 25 return true; 26 } 27 for(int j=0;j<Link[v];j++){ 28 if(dfs(vLink[v][j])){ 29 vLink[v][j]=u; 30 return true; 31 } 32 } 33 } 34 } 35 return false; 36 } 37 38 bool Match() 39 { 40 memset(Link,0,sizeof(Link)); 41 memset(vLink,0,sizeof(vLink)); 42 for(int i=0;i<n;i++){ 43 memset(mark,false,sizeof(mark)); 44 if(!dfs(i))return false; 45 } 46 return true; 47 } 48 49 int main() 50 { 51 // freopen("1.txt","r",stdin); 52 char name[22]; 53 int x; 54 while(scanf("%d%d",&n,&m),(n+m)){ 55 for(int i=0;i<n;i++)vet[i].clear(); 56 for(int i=0;i<n;i++){ 57 scanf("%s",name); 58 while(getchar()==' '){ 59 scanf("%d",&x); 60 vet[i].push_back(x); 61 } 62 } 63 int low=0,high=n; 64 while(low<=high){ 65 limit=(low+high)>>1; 66 if(Match()){ 67 ans=limit;//保留 68 high=limit-1; 69 }else 70 low=limit+1; 71 } 72 printf("%d\n",ans); 73 } 74 return 0; 75 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· 博客园 & 1Panel 联合终身会员上线
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· https证书一键自动续期,帮你解放90天限制
· 告别虚拟机!WSL2安装配置教程!!!
· 在线客服系统 QPS 突破 240/秒,连接数突破 4000,日请求数接近1000万次,.NET 多