题目大意:n个装备,每个装备有两个属性值可以二选一,问能选出的最长的从1开始的连续正整数序列。(属性值<=10000,n<=10^6)
思路:匈牙利二分图匹配模板复习,复杂度O(10000^2)。
#include<cstdio> inline int read() { int x;char c; while((c=getchar())<‘0‘||c>‘9‘); for(x=c-‘0‘;(c=getchar())>=‘0‘&&c<=‘9‘;)x=(x<<3)+(x<<1)+c-‘0‘; return x; } #define MN 1000000 #define MM 10001 struct edge{int nx,t;}e[MN*2+5]; int h[MM+5],en,cnt,u[MN+MM+5],t[MN+MM+5]; inline void ins(int x,int y){e[++en]=(edge){h[x],y};h[x]=en;} bool dfs(int x) { for(int i=h[x];i;i=e[i].nx)if(u[e[i].t]!=cnt) { u[e[i].t]=cnt; if(!t[e[i].t]||dfs(t[e[i].t]))return t[e[i].t]=x; } return false; } int main() { int n=read(),i; for(i=1;i<=n;++i)ins(read(),i+MM),ins(read(),i+MM); for(cnt=1;dfs(cnt);++cnt); printf("%d",cnt-1); }
原文:http://www.cnblogs.com/ditoly/p/BZOJ1854.html