题目大意:

$n$个装备,每个装备有两个值,可以攻击该值对应的怪兽。每个装备最多用一次

每个怪兽被打一次之后就会死,每个怪兽可以被打当且仅当前面的都死了,求最多打多少个

思路:

很明显的二分图匹配,如果用$Dinic$的时候一条一条加入连向终点的边即可

但是为什么这道题我$TLE$了啊 垃圾Dinic要你有何用,我也不(wang)会(le)匈牙利啊

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
#define ll long long
#define db double
#define inf 2139062143
#define MAXN 4010
#define MOD 1000000007
#define rep(i,s,t) for(register int i=(s),i##__end=(t);i<=i##__end;++i)
#define dwn(i,s,t) for(register int i=(s),i##__end=(t);i>=i##__end;--i)
#define ren for(register int i=fst[x];i;i=nxt[i])
#define pb(i,x) vec[i].push_back(x)
#define pls(a,b) (a+b+MOD)%MOD
#define mns(a,b) (a-b+MOD)%MOD
#define mul(a,b) (1LL*(a)*(b))%MOD
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,s,t;
struct Dinic
{
int fst[MAXN],nxt[MAXN<<],to[MAXN<<],val[MAXN<<],cnt;
int S,T,vis[MAXN],tot,cur[MAXN],q[MAXN],l,r,dis[MAXN];
Dinic(){memset(fst,,sizeof(fst));cnt=;}
void add(int u,int v,int w) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v,val[cnt]=w;}
void ins(int u,int v,int w) {add(u,v,w);add(v,u,);}
int bfs()
{
q[l=r=]=T,vis[T]=++tot,dis[T]=;int x;
while(l<=r)
{
x=q[l++];cur[x]=fst[x];ren if(vis[to[i]]!=tot&&val[i^])
vis[to[i]]=tot,dis[to[i]]=dis[x]+,q[++r]=to[i];
}
return vis[S]==tot;
}
int dfs(int x,int a)
{
if(x==T||!a) return a;int f,flw=;
for(int& i=cur[x];i&&a;i=nxt[i])
if(val[i]&&dis[to[i]]==dis[x]-&&(f=dfs(to[i],min(a,val[i]))))
val[i]-=f,val[i^]+=f,flw+=f,a-=f;return flw;
}
int solve(int s,int t,int res=)
{S=s,T=t;while(bfs()) res+=dfs(S,inf);return res;}
}D;
int main()
{
n=read(),m=read(),s=,t=n+m+;int a,b;rep(i,,m)
{a=read()+,b=read()+;D.ins(a,i+n,);D.ins(b,i+n,);}
rep(i,,n) D.ins(s,i,);
rep(i,,m+) {D.ins(i+n,t,);if(!D.solve(s,t)) return printf("%d\n",i-),;}
}

bzoj 1191 代码(与此题只是数据范围区别

然后发现了奇妙的并查集做法

对每个装备的两个值连边,若形成一个$x$个点的树,则我们可以选走$x-1$个点,留下最大的那个

若成环,则都可以取。这样我们并查集合并即可,合并时找出最大的不行变成可以的

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
#define ll long long
#define db double
#define inf 2139062143
#define MAXN 1001000
#define MOD 1000000007
#define rep(i,s,t) for(register int i=(s),i##__end=(t);i<=i##__end;++i)
#define dwn(i,s,t) for(register int i=(s),i##__end=(t);i>=i##__end;--i)
#define ren for(register int i=fst[x];i;i=nxt[i])
#define pb(i,x) vec[i].push_back(x)
#define pls(a,b) (a+b+MOD)%MOD
#define mns(a,b) (a-b+MOD)%MOD
#define mul(a,b) (1LL*(a)*(b))%MOD
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,fa[MAXN],ok[MAXN];
int find(int x) {return x==fa[x]?x:fa[x]=find(fa[x]);}
int main()
{
n=read(),m=;int a,b;rep(i,,m) fa[i]=i;rep(i,,n)
{
a=find(read()),b=find(read());if(a==b) {ok[a]=;continue;}
if(a>b) swap(a,b);ok[!ok[a]?a:b]=,fa[a]=b;
}rep(i,,m+) if(!ok[i]) return printf("%d\n",i-),;
}

bzoj 1894 游戏的更多相关文章

  1. bzoj 5288 游戏

    bzoj 5288 游戏 显然从点 \(x\) 出发,能到达的点是包含 \(x\) 的一段区间.用 \(L,R\) 两个数组记录每个点对应的区间端点. 如果能预处理出 \(L,R\) ,询问显然可以 ...

  2. bzoj 1854 游戏 二分图匹配 || 并查集

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

  3. BZOJ 1854 游戏

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

  4. BZOJ 1025 游戏

    Description windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,……,N写一排在纸上.然后再在这一排下面写上它们对 ...

  5. BZOJ 1443 游戏(二分图博弈)

    新知识get. 一类博弈问题,基于以下条件: 1.博弈者人数为两人,双方轮流进行决策.2.博弈状态(对应点)可分为两类(状态空间可分为两个集合),对应二分图两边(X集和Y集).任意合法的决策(对应边) ...

  6. bzoj 4465 游戏中的学问

    Written with StackEdit. Description 大家应该都见过很多人手拉手围着篝火跳舞的场景吧?一般情况下,大家手 拉手跳舞总是会围成一个大圈,每个人的左手拉着旁边朋友的右手, ...

  7. bzoj 4457: 游戏任务

    4457: 游戏任务 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 128  Solved: 71[Submit][Status][Discuss] D ...

  8. BZOJ 1854 游戏(二分图匹配或并查集)

    此题的二分图匹配做法很容易想,就是把属性当做s集,武器当做t集,如果该武器拥有该武器则连一条边. 那么答案就是求该二分图的最大前i个匹配.将匈牙利算法改一改,当前找不到增广路就break. 但是过这个 ...

  9. BZOJ 1025 游戏(分组背包)

    题目所谓的序列长度实际上就是各循环节的lcm+1. 所以题目等价于求出 一串数之和等于n,这串数的lcm种数. 由唯一分解定理可以联想到只要把每个素数的幂次放在一个分组里,然后对整体做一遍分组背包就行 ...

随机推荐

  1. Linux主机被SSH精神病(Psychos)暴力攻破后成为肉鸡的攻防过程

    近日公司局域网突然变得非常慢,上网受到很大影响,不仅仅是访问互联网慢,就连访问公司内部服务器都感到异常缓慢.于是对本局域网网关进行测试:   $ ping 10.10.26.254   发现延时很大, ...

  2. openSUSE Leap 15.0 初始配置

    添加源: # 禁用原有软件源 sudo zypper mr -da # 添加阿里镜像源 sudo zypper ar -fc https://mirrors.aliyun.com/opensuse/d ...

  3. codevs——1036 商务旅行

    1036 商务旅行  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 某首都城市的商人要经常 ...

  4. matlab安装及破解

    Matlab安装及破解: 笔者最近要做一些和建模相关的事,故此需要安装Matlab2017版.在此做下笔记. 网盘链接: 链接:https://pan.baidu.com/s/1lN8C7TDFjSV ...

  5. iOS--基于键值的观察者模式(KVO)

    VO简而言之就是:基于键值的观察者,实际上就是观察者模式. Cocoa Framework已经为我们提供了这一模式,不需要我们自己来实现了.我们只需要按照约定的方式去做就可以了.KVO主要用于用户界面 ...

  6. Mac Ubuntu ----端口被占用

    Mac下使用lsof(list open files)来查看端口占用情况,lsof 是一个列出当前系统打开文件的工具. 使用 lsof 会列举所有占用的端口列表: 1 $ lsof 使用less可以用 ...

  7. js监听鼠标点击操作

    element.addEventListener('click', function() { /* do stuff here*/ }, false);

  8. ReactNavtive框架教程(3)

    原文:http://www.raywenderlich.com/99473/introducing-react-native-building-apps-javascript 注意:全部图片放在了百度 ...

  9. HTML小知识点积累

    1.怎样让heigth:100%起效?   有时候我们设置heigth:100%,想让当前控件铺满整个屏幕,可是非常少情况下这个属性能达到我们想要的效果,这是为什么呢?   而依据W3C的规范.百分比 ...

  10. hdu 1250 Hat&#39;s Fibonacci

    pid=1250">点击此处就可以传送hdu 1250 Problem Description A Fibonacci sequence is calculated by adding ...