题目链接: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; }