zoukankan      html  css  js  c++  java
  • 暑假D14 [SCOI2010]连续攻击游戏(二分图)

    题意

    有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
  • 相关阅读:
    树的遍历
    动态规划之背包问题
    Dijkstra算法
    最短路径
    关于数学公式Markdown
    子集数
    O、Θ、Ω
    AT212 P-CASカードと高橋君
    vector的使用方法
    P3512 [POI2010]PIL-Pilots 单调队列的应用
  • 原文地址:https://www.cnblogs.com/sto324/p/11266580.html
Copyright © 2011-2022 走看看