题目链接:https://ac.nowcoder.com/acm/problem/20566
题目大意:
思路:
我们把属性值抽象为点,和每个装备,那么就是一个二分图。
例如:题目的二分图。
我们匈牙利匹配左点,因为要连续,如果开始不匹配,就break。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
struct Edge {
int to,next;
} edge[maxn << 1];
struct Hyali {
int cnt,head[maxn];
int now,use[maxn],match[maxn];
void init() {
now=cnt=0;
memset(head, -1, sizeof(head));
memset(use, 0, sizeof(use));
memset(match, 0, sizeof(match));
}
void add_edge(int u,int v) {
edge[++cnt].next = head[u];
edge[cnt].to = v;
head[u] = cnt;
}
bool dfs(int u) { // 二分图匹配匈牙利算法;
for (int i = head[u]; i != -1; i = edge[i].next) {
int to = edge[i].to;
if (use[to] == now)
continue;
//这个点在同一次匹配 没去过
use[to] = now;//进行匹配
// 这个点还没有被匹配 或者,他可以匹配其他的人
if (!match[to] || dfs(match[to])) {
match[to] = u;
return true;
}
}
return false;
}
int work(int n) {
int ans=0;
for(int i = 1 ; i <= n ; i++) {
now = i; // 标记use的时间戳,代替memset;
if(dfs(i))
ans++;
else{
break;
}
}
return ans;
}
} T;
int main () {
int n; scanf("%d", &n);
T.init();
for(int i=1; i<=n; i++){
int x, y; scanf("%d%d", &x, &y);
T.add_edge(x, i);
T.add_edge(y, i);
}
int ans=T.work(maxn);
printf("%d\n", ans);
return 0;
}

京公网安备 11010502036488号