zoukankan      html  css  js  c++  java
  • 洛谷 P1640 [SCOI2010]连续攻击游戏(二分图匹配)

    传送门


    解题思路

    从所有攻击力向武器连边,形成二分图,然后枚举攻击力1...10000,如果匹配成功,就继续,否则输出程序结束。

    注意:

    对于枚举每一个攻击力如果用memset清空vis数组会超时(TLE四个点),所以我们在标记后退出前单个清空(见代码)。

    AC代码

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 const int maxn=1000005;
     6 int cnt,n,p[10005],vis[maxn],ok[maxn];
     7 struct edge{
     8     int v,next;
     9 }e[maxn*2];
    10 void insert(int u,int v){
    11     cnt++;
    12     e[cnt].v=v;
    13     e[cnt].next=p[u];
    14     p[u]=cnt;
    15 }
    16 bool work(int u){
    17     for(int i=p[u];i!=-1;i=e[i].next){
    18         int v=e[i].v;
    19         if(vis[v]) continue;
    20         vis[v]=1;
    21         if(!ok[v]||work(ok[v])){
    22             ok[v]=u;
    23             vis[v]=0;
    24             return true;
    25         }
    26         vis[v]=0;
    27     }
    28     return false;
    29 }
    30 int main()
    31 {
    32     memset(p,-1,sizeof(p));
    33     cin>>n;
    34     for(int i=1;i<=n;i++){
    35         int u1,u2;
    36         scanf("%d%d",&u1,&u2);
    37         insert(u1,i);
    38         insert(u2,i);
    39     }
    40     for(int i=1;i<=10001;i++){
    41         if(!work(i)){
    42             cout<<i-1;
    43             return 0;
    44         }
    45     }
    46     return 0;
    47 }

    //SCOI2010 Day1t2

  • 相关阅读:
    对拍程序的写法
    单调队列模板
    [bzoj1455]罗马游戏
    KMP模板
    [bzoj3071]N皇后
    [bzoj1854][SCOI2010]游戏
    Manacher算法详解
    [bzoj2084][POI2010]Antisymmetry
    Python_sklearn机器学习库学习笔记(一)_一元回归
    C++STL学习笔记_(1)string知识
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/12246239.html
Copyright © 2011-2022 走看看