@luogu
看上去这是一道二分图题,将点i和它的两个属性值分别作为两个点集,分别连边后跑匈牙利树,若找不到匹配则输出解。
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
vector<int> e[2000010];
int ans,n,x,y,cx[2000010],cy[2000010];
bool vis[2000010];
bool dfs(int u){
for(unsigned int i=0;i<e[u].size();i++) {
int v=e[u][i];
if(!vis[v]) {
vis[v]=1;
if(cy[v]==-1||dfs(cy[v])){
cx[u]=v;cy[v]=u;
return true;
}
}
}
return false;
}
int main() {
freopen("attack.in","r",stdin);
freopen("attack.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d%d",&x,&y);
e[x].push_back(i);
e[y].push_back(i);
//e[n+x].push_back(i);
//e[n+y].push_back(i);
}
memset(cx,-1,sizeof cx);
memset(cy,-1,sizeof cy);
for(int i=1;i<=10000;i++)
if(cx[i]==-1) {
memset(vis,0,sizeof vis);
if (!dfs(i)) {
printf("%d\n",i-1);
return 0;
}
}
return 0;
}