洛谷 P2071 座位安排

题目传送门

解题思路:

题目里说的很清楚,二分图的最大匹配,与模板不同的地方在于,一排座位可以连两个人。

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 
 7 int n,head[5005],tot,vis[5005],ans,g[5005],g1[5005];
 8 struct kkk {
 9     int to,next;
10 }e[10001];
11 
12 inline void add(int x,int y) {
13     e[++tot].to = y;
14     e[tot].next = head[x];
15     head[x] = tot;
16 }
17 
18 inline bool find(int x) {
19     for(int i = head[x];i; i = e[i].next) {
20         int u = e[i].to;
21         if(vis[u]) continue;
22         vis[u] = 1;
23         if(g[u] == 0) {
24             g[u] = x;
25             return true;
26         }
27         if(g1[u] == 0) {
28             g1[u] = x;
29             return true;
30         }
31         if(find(g[u])) {
32             g[u] = x;
33             return true;
34         }
35         if(find(g1[u])) {
36             g1[u] = x;
37             return true;
38         }
39     }
40     return false;
41 }
42 
43 int main() {
44     scanf("%d",&n);
45     for(int i = 1;i <= n * 2; i++) {
46         int x,y;
47         scanf("%d%d",&x,&y);
48         add(i,x);
49         add(i,y);
50     }
51     for(int i = 1;i <= n * 2; i++) {
52         memset(vis,0,sizeof(vis));
53         if(find(i)) ans++;
54     }
55     printf("%d",ans);
56     return 0;
57 }
原文地址:https://www.cnblogs.com/lipeiyi520/p/13485715.html