二分图匹配
一个一个匹配过去,遇到不能匹配的就是能通过的最大题数
#include<cstdio> #include<cstring> #include<cctype> using namespace std; int n,m,ans,vis[1004],res[1004],map[1003][1003]; inline int read(){ char ch=getchar();int k=0; while(!isdigit(ch))ch=getchar(); while(isdigit(ch)){k=(k<<1)+(k<<3)+ch-‘0‘;ch=getchar();} return k; } bool find(int x){ for(int i=1;i<=m;i++){ if(!vis[i]&&map[x][i]){ vis[i]=1; if(!res[i]||find(res[i])){ res[i]=x;return 1; } } } return 0; } int main(){ m=read(),n=read(),ans=n; for(int i=1;i<=n;i++){ int a; a=read();map[i][a+1]=1; a=read();map[i][a+1]=1; } for(int ii=1;ii<=n;ii++){ memset(vis,0,sizeof(vis)); if(!find(ii)) {ans=ii-1;break;} } printf("%d\n",ans); return 0; }