题目大意:给定n个锦囊和m个问题,每个问题可以使用给定的两个锦囊之一,必须连续答题,求最多答上多少题
题解:题看成一组点,锦囊看成一组点,大力匹配即可
我的收获:naive
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int M=1005;
int n,m,mp[M][M],lik[M];
bool vis[M];
bool hungary(int x)
{
for(int i=1;i<=n;i++){
if(!mp[x][i]||vis[i]) continue;
vis[i]=true;
if(!lik[i]||hungary(lik[i])) return lik[i]=x;
}
return false;
}
void work()
{
int ans=0;
for(int i=1;i<=m;i++){
memset(vis,0,sizeof(vis));
if(hungary(i)) ans++;
else break;
}
cout<<ans<<endl;
}
void init()
{
int x,y;
cin>>n>>m;
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
mp[i][x+1]=mp[i][y+1]=1;
}
}
int main()
{
init();
work();
return 0;
}