[SCOI2010]连续攻击游戏

                                                [SCOI2010]连续攻击游戏

 

题目描述

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

来源:SCOI 2010

 

二分图嘛 好像听说可以用并查集来维护连通块。。

建图如下:

每个装备只能用一次 我们可以把攻击顺序化成点 与装备匹配

跑二分图时,只要一次匹配不成功就停止 

因为攻击是按照 1 2 3 的顺序来的

 

 1 #include <cctype>
 2 #include <cstdio>
 3 #include <cstring>
 4 
 5 const int MAXN=1000010;
 6 
 7 int n,ans,id;
 8 
 9 int mark[MAXN],vis[MAXN];
10 
11 struct node {
12     int to;
13     int next;
14     node() {}
15     node(int to,int next):to(to),next(next) {}
16 };
17 node e[MAXN<<1];
18 
19 int head[MAXN],tot;
20 
21 inline void add(int x,int y) {
22     e[++tot]=node(y,head[x]);
23     head[x]=tot;
24 }
25 
26 inline void read(int&x) {
27     x=0;int f=1;char c=getchar();
28     while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
29     while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-48;c=getchar();}
30     x=x*f;
31 }
32 
33 bool find(int u) {
34     for(register int i=head[u];i;i=e[i].next) {
35         int v=e[i].to;
36         if(vis[v]-id) {
37             vis[v]=id;
38             if(!mark[v]||find(mark[v])) {
39                 mark[v]=u;
40                 return true;
41             }
42         }
43     }
44     return false;
45 }
46 
47 int hh() {
48     read(n);
49     for(int x,y,i=1;i<=n;++i) {
50         read(x);read(y);
51         add(x,i);add(y,i);
52     }
53     id=1;
54     for(int i=1;i<=10000;++i,++id) {
55         
56         if(find(i)) ++ans;
57         else break;
58     }
59     printf("%d\n",ans);
60     return 0;
61 }
62 
63 int sb=hh();
64 int main(int argc,char**argv) {;}
代码

 

posted @ 2017-09-03 15:20  拿叉插猹哈  阅读(152)  评论(0编辑  收藏  举报