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; }