Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 18208 | Accepted: 9917 |
Description
Input
Output
Sample Input
3 4 1 1 1 3 2 2 3 2
Sample Output
2
Hint
Source
#pragma warning(disable:4786)//使命名长度不受限制 #pragma comment(linker, "/STACK:102400000,102400000")//手工开栈 #include <map> #include <set> #include <queue> #include <cmath> #include <stack> #include <cctype> #include <cstdio> #include <cstring> #include <stdlib.h> #include <iostream> #include <algorithm> #define rd(x) scanf("%d",&x) #define rd2(x,y) scanf("%d%d",&x,&y) #define rds(x) scanf("%s",x) #define rdc(x) scanf("%c",&x) #define ll long long int #define maxn 505 #define mod 1000000007 #define INF 0x3f3f3f3f //int 最大值 #define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i) #define MT(x,i) memset(x,i,sizeof(x)) #define PI acos(-1.0) #define E exp(1) using namespace std; bool bmap[maxn][maxn]; bool bmask[maxn]; int n,m,x,y; int cx[maxn]; int findpath(int u){ FOR(i,1,n) if(bmap[u][i]&&!bmask[i]){ bmask[i]=1; if(cx[i]==-1||findpath(cx[i])){ cx[i]=u; return 1; } } return 0; } int MaxMatch(){ int res(0); FOR(i,1,n){ MT(bmask,false); if(findpath(i)) res++; } return res; } int main(){ while(rd2(n,m)!=EOF){ MT(bmap,0); MT(bmask,0); MT(cx,-1); FOR(i,1,m){ rd2(x,y); bmap[x][y]=1; } printf("%d\n",MaxMatch()); } return 0; } /* 3 4 1 1 1 3 2 2 3 2 */