题目大意&数据范围
(绝对不是懒得打才放图的qwq)
思路
题目中说明每一种怪物都是有且只有一种对应的剑术和法术,所以当一种怪物没有所对应的剑术或法术时,直接判断无解即可。
自然,如果满足以上条件的话,我们将每一种怪物想象成一条线段,剑术对应的为左端点,法术对应的为右端点,那么,我们的目标就变为:选择若干个点,使得每一条线段至少有一个端点被覆盖,求最小的选择点数,这就是经典的最小点覆盖问题,可以证明:最小选择点数即为二分图的最大匹配数,那么就可以用匈牙利算法或网络流算法求解。
AC代码
#include<cstring>
#include<iostream>
#include<algorithm>
#include<iostream>
#include<map>
using namespace std;
map<string,int> ma;
int p,n,m,tot,cnt,ans,k;
bool bz[2020][2020];
int num[10010];
int to_sword[10010];
int to_magic[10010];
bool vis[10010];
string s;
inline int read()
{
int num=0,f=1;
char ch=getchar();
while(!