题目:给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数。
解法:匈牙利算法。(以前我总是不记得......)实质上应该有贪心的思想,每次都尽量匹配,找到能和自己匹配的也尽量让它们匹配。若对方已有匹配的对象,就让那个对象尽量调整来使自己这对能凑起来。而要注意,每次问过的对象就不要再问了,也就是不要让它的对象总是换来换去......
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int N=1010,M=1010; 8 int n,m,e; 9 int vis[N][N];10 int ask[M],cp[M];11 12 bool ffind(int x)13 {14 for (int i=1;i<=m;i++)15 if (vis[x][i])16 {17 if (ask[i]) continue;18 ask[i]=1;19 if (!cp[i]||ffind(cp[i]))20 {cp[i]=x;return true;}21 }22 return false;23 }24 void getmatch()25 {26 int ans=0;27 memset(cp,0,sizeof(cp));28 for (int i=1;i<=n;i++)29 {30 memset(ask,0,sizeof(ask));31 if (ffind(i)) ans++;32 }33 printf("%d\n",ans);34 }35 int main()36 {37 scanf("%d%d%d",&n,&m,&e);38 for (int i=1;i<=e;i++)39 {40 int x,y;41 scanf("%d%d",&x,&y);42 vis[x][y]=1;43 }44 getmatch();45 return 0;46 }