BZOJ1854_游戏_KEY

题目传送门

一看便知,二分图最大匹配的裸题。

但是,用匈牙利算法的话,每一次的memset会超时,所以这里使用时间戳优化。

[时间戳]

记录每一次操作是第几次,只要不是现在这个操作的话就相当于“0”。

code

#include <bits/stdc++.h>
#define MAXN 1000100
using namespace std;
int n,vis[MAXN],now,pre[MAXN];
vector <int> A[MAXN];
int find(int x){
    for(int i=0;i<A[x].size();i++){
        int to=A[x][i];
        if(vis[to]!=now){
            vis[to]=now;
            if(!pre[to]||find(pre[to])){
                pre[to]=x;
                return 1;
            }
        }
    }
    return 0;
}
int main(){
    scanf("%d",&n);
        for(int i=1;i<=n;i++){
            int x,y;scanf("%d%d",&x,&y);
            A[x].push_back(i);
            A[y].push_back(i);
        }
        for(int i=1;i<=n;i++){
            now++;
            if(!find(i)){
                printf("%d",i-1);
                return 0;
            }
        }
    printf("%d",n);
    return 0;
}
原文地址:https://www.cnblogs.com/Cptraser/p/7593440.html