[SCOI2010] 连续攻击游戏

https://www.luogu.org/problemnew/show/P1640

luogu数据真心水。
对于这种要多次二分图匹配的,可以把vis数组定义成一个int型的,加一个时间戳,然后dfs的时候只需判定是否这个时间遍历过这个点,然后就可以了。不用多次memset。操作神奇。

#include<cstdio>
#include<cstring>
using namespace std;
int n,ecnt;
const int N=1000005;
int head[N],match[N];
struct Edge{
    int to,nxt;
}e[N<<1];
int vis[N],tim;
void add(int bg,int ed){
    e[++ecnt].nxt=head[bg];
    e[ecnt].to=ed;
    head[bg]=ecnt;
}
bool dfs(int x){
    if(vis[x]==tim)return 0;
    vis[x]=tim;
    for(int i=head[x];i;i=e[i].nxt){
        int v=e[i].to;
        if(!match[v]||dfs(match[v])){
            match[v]=x;
            return 1;
        }
    }
    return 0;
}
int main() {
    scanf("%d",&n);
    for(int i=1,a,b;i<=n;i++){
        scanf("%d%d",&a,&b);
        add(a,i);
        add(b,i);
    }
    int ans=0;
    for(int i=1;i<=1000000;i++){
    	tim++;
        if(dfs(i))ans++;
        else break;
    }
    printf("%d",ans);
}
我是咸鱼。转载博客请征得博主同意Orz
原文地址:https://www.cnblogs.com/sdfzhsz/p/9249433.html