[BZOJ]1854: [Scoi2010]游戏

题目大意: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);
}
原文地址:https://www.cnblogs.com/ditoly/p/BZOJ1854.html