这个没什么好说的。。。懂这个算法救知道。。这个水题很简单了。。。。 #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int maxlen=505; int maze[maxlen][maxlen],match[maxlen]; bool vis[maxlen]; int crosspath(int x){ int i,k; for(i=1;i<=maze[x][0];i++){ k=maze[x][i]; if(!vis[k]){ vis[k]=1; if(match[k]==0 || crosspath(match[k])){ match[k]=x; return 1; } } } return 0; } int hungary(int n){ int sum=0; for(int i=1;i<=n;i++){ memset(vis,0,sizeof(vis)); if(crosspath(i)) sum++; } return sum; } int main(int argc, char** argv) { int n,m,i,ans; int a,b; while(scanf("%d%d",&n,&m)!=-1){ memset(maze,0,sizeof(maze)); memset(match,0,sizeof(match)); for(i=0;i<m;i++){ scanf("%d%d",&a,&b); maze[a][++maze[a][0]]=b; } ans=hungary(n); printf("%d/n",ans); } return 0; }