点此看题面

大致题意: 有\(n\)个物品,每个物品有两个属性且只能选择其中的一个,要求选择的物品属性值从\(1\)开始递增,问最多能选多少个。

暴搜

看到这题,我第一反应是暴搜... ...

好不容易过了样例,然后又调了半天,结果\(TLE\)了,只得了\(50\)分... ...

匈牙利算法

好吧,此题的正解是匈牙利算法,思想还是比较巧妙的。

建图

我们可以将每个物品的两个属性值作为左半部分的点,将每个物品作为右半部分的点,然后对于每个物品,将其两个属性与其编号连一条边。

然后就出现了一张二分图

匈牙利算法即可。

不过注意,此题不是求最大匹配,只要有一个属性值失配就需要立刻退出循环

代码

  1. #include<bits/stdc++.h>
  2. #define max(x,y) ((x)>(y)?(x):(y))
  3. #define min(x,y) ((x)<(y)?(x):(y))
  4. #define uint unsigned int
  5. #define LL long long
  6. #define ull unsigned long long
  7. #define swap(x,y) (x^=y,y^=x,x^=y)
  8. #define abs(x) ((x)<0?-(x):(x))
  9. #define INF 1e9
  10. #define Inc(x,y) ((x+=(y))>=MOD&&(x-=MOD))
  11. #define ten(x) (((x)<<3)+((x)<<1))
  12. #define N 1000000
  13. #define add(x,y) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y)
  14. using namespace std;
  15. int n,ans=0,ee=0,lnk[N+5];
  16. struct edge
  17. {
  18. int to,nxt;
  19. }e[(N<<1)+5];
  20. class FIO
  21. {
  22. private:
  23. #define Fsize 100000
  24. #define tc() (FinNow==FinEnd&&(FinEnd=(FinNow=Fin)+fread(Fin,1,Fsize,stdin),FinNow==FinEnd)?EOF:*FinNow++)
  25. #define pc(ch) (FoutSize<Fsize?Fout[FoutSize++]=ch:(fwrite(Fout,1,FoutSize,stdout),Fout[(FoutSize=0)++]=ch))
  26. int f,FoutSize,OutputTop;char ch,Fin[Fsize],*FinNow,*FinEnd,Fout[Fsize],OutputStack[Fsize];
  27. public:
  28. FIO() {FinNow=FinEnd=Fin;}
  29. inline void read(int &x) {x=0,f=1;while(!isdigit(ch=tc())) f=ch^'-'?1:-1;while(x=ten(x)+(ch&15),isdigit(ch=tc()));x*=f;}
  30. inline void read_char(char &x) {while(isspace(x=tc()));}
  31. inline void read_string(string &x) {x="";while(isspace(ch=tc()));while(x+=ch,!isspace(ch=tc())) if(!~ch) return;}
  32. inline void write(int x) {if(!x) return (void)pc('0');if(x<0) pc('-'),x=-x;while(x) OutputStack[++OutputTop]=x%10+48,x/=10;while(OutputTop) pc(OutputStack[OutputTop]),--OutputTop;}
  33. inline void write_char(char x) {pc(x);}
  34. inline void write_string(string x) {register int i,len=x.length();for(i=0;i<len;++i) pc(x[i]);}
  35. inline void end() {fwrite(Fout,1,FoutSize,stdout);}
  36. }F;
  37. class Class_HungarianAlgorithm//匈牙利算法模板,就不解释了
  38. {
  39. private:
  40. int s[N+5],vis[N+5];
  41. public:
  42. inline bool Match(int x,int Time)
  43. {
  44. register int i;
  45. for(i=lnk[x];i;i=e[i].nxt)
  46. {
  47. if(!(vis[e[i].to]^Time)) continue;
  48. vis[e[i].to]=Time;
  49. if(!s[e[i].to]||Match(s[e[i].to],Time)) return s[e[i].to]=x,true;
  50. }
  51. return false;
  52. }
  53. }HungarianAlgorithm;
  54. int main()
  55. {
  56. register int i,x;
  57. for(F.read(n),i=1;i<=n;++i) F.read(x),add(x,i),F.read(x),add(x,i);//读入并建边
  58. for(ans=1;ans<=n;++ans) if(!HungarianAlgorithm.Match(ans,ans)) break;//求答案,只要有一个属性值失配就退出循环
  59. return F.write(ans-1),F.end(),0;//输出答案
  60. }

【BZOJ1854】[SCOI2010] 游戏(匈牙利算法的应用)的更多相关文章

  1. bzoj1854 [Scoi2010]游戏——匈牙利算法

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1854 这题...据说可以用并查集做,但没有去看... 用二分图匹配的话,就把装备和它的两个属 ...

  2. bzoj1854: [Scoi2010]游戏(匈牙利) / GDKOI Day2 T2(最大流)

    题目大意:有n(<=1000000)个装备,每个装备有两个属性值(<=10000),每个装备只能用一次,使用某一个值,攻击boss必须先使用属性为1的,再使用属性为2的,再使用属性为3的, ...

  3. bzoj1854 [Scoi2010]游戏 ([SCOI2010]连续攻击游戏)

    bzoj1854 [Scoi2010]游戏 ([SCOI2010]连续攻击游戏) 据说正解是并查集???我不会 这不是一道匈♂牙利好题吗??? 一个装备的两个属性都向它连边,然后跑一遍匈♂牙利 注意: ...

  4. [SCOI2010]连续攻击游戏 匈牙利算法

    觉得题目水的离开 不会匈牙利的请离开 不知道二分图的请离开 不屑的大佬请离开 ……. 感谢您贡献的访问量 ————————————华丽的分割线———————————— 扯淡完了,先重温一下题目 [SC ...

  5. BZOJ 1059: [ZJOI2007]矩阵游戏 匈牙利算法

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2351  Solved: 1156 题目连接 http:// ...

  6. [bzoj1854][SCOI2010]游戏

    Description 一个装备有两个属性,一个装备只能被使用一次,一次使用一种属性.攻击boss时需按属性1.属性2.属性3...属性k的顺序使用,问k最大为多少. Input 输入的第一行是一个整 ...

  7. BZOJ1854: [Scoi2010]游戏 二分图

    很早之前写的题了,发现没有更博,想了想,更一发出来. Orz ljss 这是冬令营上的例题...之后,我推出来了一种时间复杂度没有问题,空间复杂度没有问题的方法,额(⊙o⊙)…和给出的正解不同,但是能 ...

  8. [BZOJ1854][SCOI2010]游戏 二分图最大匹

    1854: [Scoi2010]游戏 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 5316  Solved: 2128[Submit][Status] ...

  9. 【ZJOI2007】【BZOJ1059】矩阵游戏 匈牙利算法

    题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换 ...

  10. bzoj1854: [Scoi2010]游戏 贪心

    lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备最多只能使 ...

随机推荐

  1. matplotlib.pyplot import报错: ValueError: _getfullpathname: embedded null character in path

    Environment: Windows 10, Anaconda 3.6 matplotlib 2.0 import matplotlib.pyplot 报错: ValueError: _getfu ...

  2. github上虽然已经有实现好的Char RNN

    前言 学习RNN的时候很多人应该都有看过Andrej Karpathy写的The Unreasonable Effectiveness of Recurrent Neural Networks,使用基 ...

  3. K8S上的ELK和应用日志上报实战

    来源:DevOps ID:Idevops168 本次实战的基础结构如下图所示: 一共有两个Pod:ELK和web应用: ELK的Pod会暴露两个服务,一个暴露logstash的5044端口,给file ...

  4. docker常用到的一些命令

    docker ps 1. docker ps -a(显示所有的容器,包括未运行的) 2.docker ps -q (只显示ip) 3. docker ps -f(根据条件过滤显示的内容) docker ...

  5. Linux 调优方案, 修改最大连接数(ulimit命令)

    https://blog.csdn.net/isoleo/article/details/51732687 https://www.cnblogs.com/zengkefu/p/5649407.htm ...

  6. php类内方法使用类外变量和类外函数

    如果要调用另一个类的属性和方法,直接实例化后调用就可以 但是要使用的变量和函数是独立的,不在本类或其他类里面,这时调用就要用下面的方法(本例是在同一个php文件里,如果不再同一个类文件可以requir ...

  7. iconfont的应用

    http://www.iconfont.cn/help/platform.html http://www.iconfont.cn/users/project 点击下载之后: 打开demo.html: ...

  8. Ehab and subtraction(思维题)

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  9. maven 引入本地项目jar报红线错误解决方法

    问题:本地创建了2个项目,A和B,A引入B,A的pom如下: <dependency> <groupId>com.ebc</groupId> <artifac ...

  10. (转)linux下文件删除的原理精华讲解(考试题答案系列)

    linux下文件删除的原理精华讲解(考试题答案系列) 说明:本文为老男孩linux培训某节课前考试试题及答案分享博文内容的一部分,也是独立成题的,你可以点下面地址查看全部的内容信息.http://ol ...