码迷,mamicode.com
首页 > 其他好文 > 详细

暑假D14 [SCOI2010]连续攻击游戏(二分图)

时间:2019-07-29 21:33:41      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:sign   建图   sig   style   vector   timer   onclick   nbsp   理解   

题意

有n个武器,每个武器有两个属性,求能得到从1开始的最长的连续属性是多少。

属性<=1e4,n<=1e6

题解

讲这道题的时候,说是二分图,想了半天愣是不知道怎么建图,不知道分成哪两部分。

后来一看题解才恍然大悟,把武器和属性分在两边,再属性和武器之间连边,那么从1开始一直做最大匹配,找不到增广路就停止。

还是比较巧妙吧(对于我),其实也应该想到(就只有武器和属性两种东西),不过可能是想到两边不均衡(蠢哭),还有就是才发现以前的代码建的双向边,好像不用(毒瘤lrd?),接着就是vis数组必须要,其实对二分图的模板更理解了一些。

技术图片
#include<bits/stdc++.h>
using namespace std;

const int maxn=10005;
const int maxm=1000005;
int n,m,ans,timer;
int match[maxm],vis[maxm+maxn];
vector<int>e[maxn+maxm];

bool dfs(int u){
    if(vis[u]==timer) return false;
    vis[u]=timer;
    for(unsigned int i=0;i<e[u].size();i++){
        int v=e[u][i];
        if(!match[v]||dfs(match[v])){
            match[v]=u;
            return true;
        }
    }
    return false;
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        e[n+x].push_back(i);
        e[n+y].push_back(i);
        m=max(m,max(x,y));
    }
    for(int i=n+1;i<=n+m;i++){
        ++timer;
        if(dfs(i)) ans++;
        else break;
    }
    printf("%d",ans);
}
View Code

 

暑假D14 [SCOI2010]连续攻击游戏(二分图)

标签:sign   建图   sig   style   vector   timer   onclick   nbsp   理解   

原文地址:https://www.cnblogs.com/sto324/p/11266580.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!