zoukankan      html  css  js  c++  java
  • [P1640][SCOI2010]连续攻击游戏

    Link:

    P1640 传送门

    Solution:

    可以发现这道题其实是属性值集合和装备集合的对应,且每个点只能用一次

    那么就能想到二分图最大匹配,一旦不可行直接退出就行了

    Tip:

    1、$Hungry$算法连有向边就行了……

    2、注意左右两个集合范围不同!

    Code:

    #include <bits/stdc++.h>
    
    using namespace std;
    const int MAXN=1e4+5;//边数和Y集合点数都为1e6级别 
    struct edge{int nxt,to;}e[2000005];
    int n,x,y,match[1000005],vis[MAXN],head[MAXN],tot;
    
    void add(int from,int to)
    {e[++tot].nxt=head[from];e[tot].to=to;head[from]=tot;}
    
    int dfs(int u)
    {
        vis[u]=true;
        for(int i=head[u];i;i=e[i].nxt)
        {
            int m=match[e[i].to];
            if(m==-1||!vis[m]&&dfs(m))
            {match[e[i].to]=u;return 1;}
        }
        return 0;
    }
    
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)//Hungry直接连单向边就行了 
            scanf("%d%d",&x,&y),add(x,i),add(y,i);
            
        int res=0;memset(match,-1,sizeof(match));
        for(int i=1;i<=10000;i++)
        {
            memset(vis,0,sizeof(vis));
            if(dfs(i)) res++;
            else break;
        }
        printf("%d",res);
        return 0;
    }
  • 相关阅读:
    【bzoj2242】[SDOI2011]计算器
    1109解题报告
    【bzoj3239】Discrete Logging
    【bzoj2480】Spoj3105 Mod
    【POJ1811】Prime Test
    【bzoj3667】Rabin-Miller算法
    【HDU2138】How many prime numbers
    卢卡斯定理
    线段树2
    畅快的甩卖
  • 原文地址:https://www.cnblogs.com/newera/p/9348195.html
Copyright © 2011-2022 走看看