题目传送门:https://www.luogu.org/problemnew/show/P2319
题意:
有n个锦囊妙计,m道题目,每一道题目有两个可以选择的锦囊妙计,但一个锦囊妙计只能用一次,求最多能通过多少道题,且求出方案数。
思路:
二分图去匹配即可。
注意的是:如果已经找到一个不能匹配的就break即可。
代码:
#include<cstdio>
#include<cstring>
bool p[1010],bz[1010][1010];
int match[1010],d[1010];
int n,m,ans;
bool find(int x)
{
for(int i=1;i<=n;i++)
if(bz[x][i]&&p[i])
{
p[i]=false;
if(!match[i]||find(match[i]))
{
match[i]=x;
d[x]=i;
return true;
}
}
return false;
}
int main()
{
int x,y;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
x++,y++;
bz[i][x]=bz[i][y]=true;
}
for(int i=1;i<=m;i++)
{
memset(p,true,sizeof(p));
if(find(i)) ans++; else break;
}
printf("%d\n",ans);
for(int i=1;i<=ans;i++)
printf("%d\n",d[i]-1);
}