zoukankan      html  css  js  c++  java
  • [匈牙利算法] 洛谷 P1640 连续攻击

    题目描述

    lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示。当他使用某种装备时,他只能使用该装备的某一个属性。并且每种装备最多只能使用一次。游戏进行到最后,lxhgww遇到了终极boss,这个终极boss很奇怪,攻击他的装备所使用的属性值必须从1开始连续递增地攻击,才能对boss产生伤害。也就是说一开始的时候,lxhgww只能使用某个属性值为1的装备攻击boss,然后只能使用某个属性值为2的装备攻击boss,然后只能使用某个属性值为3的装备攻击boss……以此类推。现在lxhgww想知道他最多能连续攻击boss多少次?

    输入输出格式

    输入格式:

    输入的第一行是一个整数N,表示lxhgww拥有N种装备接下来N行,是对这N种装备的描述,每行2个数字,表示第i种装备的2个属性值

    输出格式:

    输出一行,包括1个数字,表示lxhgww最多能连续攻击的次数。

    输入输出样例

    输入样例#1:
    3
    1 2
    3 2
    4 5
    
    输出样例#1:
    2

    说明

    Limitation

    对于30%的数据,保证N < =1000

    对于100%的数据,保证N < =1000000

    题解

    • 这种题目的建图都比较奇妙,每个属性向所装备的下标连一条边,然后按顺序来求最大匹配
    • 这样为什么是对的呢?因为每次匹配就等于1~i-1的属性都以经匹配完了(因为是按顺序来的)
    • 所以如果i对应的编号j被匹配了的话
    • 那么就让匹配j的那个属性p再去找别的物品标号匹配
    • 形象地说,就是用别的物品来释放攻击力为p的这个技能,用j这个物品释放攻击力为i的技能

    代码

     1 #include <cstdio> 
     2 #include <iostream>
     3 using namespace std;
     4 struct edge{int to,from;}e[2000010];
     5 bool vis[1000010];
     6 int n,cnt,ans,p[1000010],head[1000010];
     7 void insert(int x,int y) { e[++cnt].to=y; e[cnt].from=head[x]; head[x]=cnt; }
     8 bool xyl(int x)
     9 {
    10     if (vis[x]) return 0;
    11     vis[x]=1;
    12     for (int i=head[x];i;i=e[i].from)
    13         if (!p[e[i].to]||xyl(p[e[i].to]))
    14         {
    15             p[e[i].to]=x;
    16             return 1;
    17         }
    18     return 0;
    19 }
    20 int main()
    21 {
    22     scanf("%d",&n);
    23     for (int i=1,x,y;i<=n;i++) scanf("%d%d",&x,&y),insert(x,i),insert(y,i); 
    24     for (int i=1;i<=10000;i++)
    25     {
    26         memset(vis,0,sizeof(vis));
    27         if (xyl(i)) ans++; else break;
    28     }
    29     printf("%d",ans);
    30 }
  • 相关阅读:
    【NOIP 2003】 加分二叉树
    【POJ 1655】 Balancing Act
    【HDU 3613】Best Reward
    【POJ 3461】 Oulipo
    【POJ 2752】 Seek the Name, Seek the Fame
    【POJ 1961】 Period
    【POJ 2406】 Power Strings
    BZOJ3028 食物(生成函数)
    BZOJ5372 PKUSC2018神仙的游戏(NTT)
    BZOJ4836 二元运算(分治FFT)
  • 原文地址:https://www.cnblogs.com/Comfortable/p/9832483.html
Copyright © 2011-2022 走看看