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