大水题啊
```cpp
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m;int mp[1005][1005],flag[1005],mat[1005],from[1005];
bool km(int x){
for(int i=0;i<n;i++)
{
if(mp[x][i]&&!flag[i])
{
flag[i]=1;
if(!mat[i]||km(mat[i]))
{
mat[i]=x;
from[x]=i;
return 1;
}
}
}
return 0;
}
int main(){
scanf("%d%d",&n,&m);
int x,y;
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
mp[i][x]=mp[i][y]=1;
}
int ans=0;
for(int i=1;i<=m;i++)
{
memset(flag,0,sizeof(flag));
if(km(i)) ans++;
else break;
}
printf("%d\n",ans);
for(int i=1;i<=ans;i++){
printf("%d\n",from[i]);
}
return 0;
}
```
by Edgration @ 2017-06-23 15:55:44
捕捉野生红名dalao
by Mirach @ 2017-10-23 21:28:03
@[Edgration](/space/show?uid=42857) 巨佬求助
```
#include<bits/stdc++.h>
using namespace std;
int gx[1000][1000],a[1000],vis[1000],b[1000];
int n,m,k,x,y,sum,ans;
//gx[i][j]:表示i和j可以相连
//a[i]:表示i暂时最好情况连a[i]
//vis[i]:表示i已经被连
int Find(int x){
for(int i=0;i<=m-1;i++){//遍历所有被选者
if(gx[x][i]==1&&vis[i]==0){
//如果 x和i可以相连,且在这一个递归选取阶段暂时没有被选取
//暂时选取,因为新的递归可能会换更好的
vis[i]=1;//标记被选取
if(a[i]==0||Find(a[i])){
//如果被选者没有相连点或他的相连点着可以调换
//那么他的相连点就可以选择其它没有相连点的点,以求最多
a[i]=x;//将相连点定为 x
ans++;
b[ans]=x;
return 1;
}
}
}
return 0;
}
int main(){
cin>>n>>m;
for(int i=0;i<=m-1;i++){
cin>>x>>y;
gx[i][x]=1;
gx[i][y]=1;
}
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));//每次都要清 0
if(Find(i)!=0)
sum++;//找到一对就记录
}
cout<<sum<<endl;
for(int i=1;i<=sum;i++){
cout<<a[i]<<endl;
}
return 0;
}
```
by xlxl @ 2019-08-12 11:41:09
@[xlxl](/user/120669)
>主持人问题准备了若干道题目,只有当选手正确回答一道题后,才能进入下一题,**否则就被淘汰**。
最后那里要 $\tt break$ 呀
by sid666 @ 2022-02-10 19:22:49