P1640 [SCOI2010]连续攻击游戏

P1640 [SCOI2010]连续攻击游戏

分析

不难想到,我们可以从攻击向装备连接一条边,从而跑一个最大匹配就可以得到答案.....了么?

不要忘了数据范围,数据范围是1e6因此,最大数据情况下,我们不停的清空st数组,时间必炸

那怎么办呢?

重点优化

我们加入时间戳的概念,在全局统计一个now变量,它表示的是当前搜索到的是第几个。

而st数组存则是,上次被扫描到的时候的时间,若不等于当前时间,则说明当前还未被遍历过。因此完成了对时间的优化

AC_code

#include<bits/stdc++.h>
using namespace std;
const int N =  1e6 + 10;
int h[N],ne[N<<1],e[N<<1],idx;
int match[N],st[N];
int n,now;

void add(int a,int b)
{
    e[idx] = b,ne[idx] = h[a],h[a] = idx++;
}

bool find(int x)
{
    for(int i=h[x];~i;i=ne[i])
    {
        int j = e[i];
        if(st[j]!=now)
        {
            st[j] = now;
            if(!match[j]||find(match[j]))
            {
                match[j] = x;
                return 1;
            }
        }
    }
    return 0;
}

int main()
{
    scanf("%d",&n);
    memset(h,-1,sizeof h);
    for(int i=1;i<=n;i++)
    {
        int a,b;cin>>a>>b;
        add(a,i),add(b,i);
    }
    int ans = 0;
    for(int i=1;i<=10000;i++)
    {
        now++;
        if(find(i)) ans++;
        else break;
    }
    cout<<ans<<endl;
}
posted @ 2022-03-18 21:05  艾特玖  阅读(42)  评论(0)    收藏  举报