传送门:牛客
题目描述
lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]
之间的数表示。当他使用某种装备时,他只能使用该装备的某一个属性。并且每种装备最多只能使用一次。
游戏进行到最后,lxhgww遇到了终极boss,这个终极boss很奇怪,攻击他的装备所使用的属性值必须从1开始连
续递增地攻击,才能对boss产生伤害。也就是说一开始的时候,lxhgww只能使用某个属性值为1的装备攻击
boss,然后只能使用某个属性值为2的装备攻击boss,然后只能使用某个属性值为3的装备攻击boss……以此类
推。现在lxhgww想知道他最多能连续攻击boss多少次?
输入:
3
1 2
3 2
4 5
输出:
2
emmm,这道题的背景是二分图匹配,所以…如果不会二分图算法的,可以百度学习或者移步这里,感觉我解释的还是挺详细的
对于这道题我们最重要的的显然是如何根据我们的二分图进行一个建边.emmm,因为我们的每一个武器只能用一个属性,所以显然我们可以将我们的属性当做我们二分图的左部端点,将我的武器编号当做我们的右端点,因为我们每一次都只能选择一个属性和我们的右端点进行连接.并且显然我们的一个属性可能被多个武器所拥有,这也符合了我们二分图的枚举的一个性质.
所以我们就开始建边,边以属性为端点指向武器编号,然后进行一个二分图匹配(从1开始枚举)即可.也就是对于一个属性,我们判断它的每一条边,假设右端点没有被之前的左端点所匹配的话,直接相连,假设已经被匹配过的话,我们就直接枚举之前与之匹配的左端点,看看它还有没有其他的点可以连接(也就是一个退让),具体的方案可以见我的二分图匹配的博客(网址在之前给出)
下面是具体的代码部分:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <stack>
#include <deque>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {
	ll x=0,w=1;char ch=getchar();
	for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
	return x*w;
}
#define maxn 1000000
#define ll_maxn 0x3f3f3f3f3f3f3f3f
const double eps=1e-8;
int n,m,e;int u,v;
vector<int>edge[maxn];
int vis[1000];int faxiang[maxn];
int dfs(int u) {
	for(int i=0;i<edge[u].size();i++) {
		int v=edge[u][i];
		if(vis[v]) continue;
		vis[v]=1;
		if(!faxiang[v]||dfs(faxiang[v])) {
			faxiang[v]=u;
			return true;
		}
	}
	return false;
}
int main() {
	n=read();m=read();e=read();
	for(int i=1;i<=e;i++) {
		u=read();v=read();
		edge[u].push_back(v);
	}
	int ans=0;
	for(int i=1;i<=n;i++) {
		memset(vis,0,sizeof(vis));
		if(dfs(i)) {
			ans++;
		}
	}
	cout<<ans<<endl;
	return 0;
}
 
                   
                   
                   
                   
                             这篇文章介绍了一种通过二分图匹配算法解决游戏中的装备选择问题,玩家需按属性连续攻击终极boss。博主详细解析了如何将装备属性映射到二分图节点,并利用匹配算法确定攻击次数。
这篇文章介绍了一种通过二分图匹配算法解决游戏中的装备选择问题,玩家需按属性连续攻击终极boss。博主详细解析了如何将装备属性映射到二分图节点,并利用匹配算法确定攻击次数。
           
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   186
					186
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            