【luogu P2071 座位安排】 题解

本文介绍了一种使用邻接表实现的匈牙利算法解决匹配问题的方法,并提供了完整的C++代码示例。该算法适用于解决二分图的最大匹配问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:https://www.luogu.org/problemnew/show/P2071#sub

邻接表 + 匈牙利

把之前的邻接矩阵匈牙利变成邻接表

要不然存不下...

code:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 inline int read()
 7 {
 8     int ret=0;
 9     char c=getchar();
10     while (c<'0' || c>'9') c=getchar();
11     while (c>='0' && c<='9'){
12         ret=((ret<<3)+(ret<<1))+c-'0';
13         c=getchar();
14     }
15     return ret;
16 }
17 const int maxn = 4010;
18 int n, ans, cnt;
19 int link[maxn], head[maxn];
20 bool vis[maxn];
21 struct edge{
22     int v,next;
23 }e[maxn<<2];
24 void add(int u, int v)
25 {
26     e[++cnt].v = v;
27     e[cnt].next = head[u];
28     head[u] = cnt;
29 }
30 bool dfs(int u)
31 {
32     int v = head[u];
33     for(int i = v; i != 0; i = e[i].next)
34     {
35         if(!vis[e[i].v])
36         {
37             vis[e[i].v] = 1;
38             if(!link[e[i].v] || dfs(link[e[i].v])) 
39             {
40                 link[e[i].v] = u;
41                 return 1;
42             }
43         }    
44     }
45     return 0;
46 }
47 int main()
48 {
49     int u,v;
50     n = read();
51     for(int i = 1; i <= n*2; i++)
52     {
53         u = read(); v = read();
54         add(i,u);
55         add(i,u+n);
56         add(i,v);
57         add(i,v+n);
58     }
59     for(int i = 1; i <= n*2; i++)
60     {
61         memset(vis,0,sizeof(vis));
62         if(dfs(i)) ans++;
63     }
64     printf("%d",ans);
65     return 0; 
66 }

 

转载于:https://www.cnblogs.com/MisakaAzusa/p/8858260.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值