二分模板

 1 #define N 202
 2 int useif[N];   //记录y中节点是否使用 0表示没有访问过,1为访问过
 3 int link[N];   //记录当前与y节点相连的x的节点
 4 int mat[N][N]; //记录连接x和y的边,如果i和j之间有边则为1,否则为0
 5 int gn,gm;    //二分图中x和y中点的数目
 6 int can(int t)
 7 {
 8     int i;
 9     for(i=1;i<=gm;i++)
10     {
11        if(useif[i]==0 && mat[t][i])
12        {
13            useif[i]=1;
14            if(link[i]==-1 || can(link[i]))
15            {
16               link[i]=t;
17               return 1;
18            }
19        }
20     }
21     return 0;
22 }
23 int MaxMatch()
24 {
25     int i,num;
26     num=0;
27     memset(link,0xff,sizeof(link));
28     for(i=1;i<=gn;i++)
29     {
30       memset(useif,0,sizeof(useif));
31        if(can(i)) num++;
32     }
33     return num;
34 }

此上为匈牙利算法,求解最大匹配问题

posted @ 2018-01-23 16:56  翛宁  阅读(98)  评论(0编辑  收藏  举报