1 bool dfs(int u) 2 { 3 for (iterator_t i = G[u].begin(); i != G[u].end(); ++i) { // 对 u 的每个邻接点 4 int v = edges[*i].to; 5 if (!check[v]) { // 要求不在交替路中 6 check[v] = true; // 放入交替路 7 if (matching[v] == -1 || dfs(matching[v])) { 8 // 如果是未盖点,说明交替路为增广路,则交换路径,并返回成功 9 matching[v] = u; 10 matching[u] = v; 11 return true; 12 } 13 } 14 } 15 return false; // 不存在增广路,返回失败 16 } 17 18 int hungarian() 19 { 20 int ans = 0; 21 memset(matching, -1, sizeof(matching)); 22 for (int u=0; u < num_left; ++u) { 23 if (matching[u] == -1) { 24 memset(check, 0, sizeof(check)); 25 if (dfs(u)) 26 ++ans; 27 } 28 } 29 return ans; 30 } 31 //https://www.cnblogs.com/wangjunyan/p/5563154.html 32 //上面是临界表,下面邻接矩阵 33 34 35 //二分图 36 #define maxn 10//表示x集合和y集合中顶点的最大个数! 37 int nx,ny;//x集合和y集合中顶点的个数 38 int edge[maxn][maxn];//edge[i][j]为1表示ij可以匹配 39 int cx[maxn],cy[maxn];//用来记录x集合中匹配的y元素是哪个! 40 int visited[maxn];//用来记录该顶点是否被访问过! 41 int path(int u) 42 { 43 int v; 44 for(v=0;v<ny;v++) 45 { 46 if(edge[u][v]&&!visited[v]) 47 { 48 visited[v]=1; 49 if(cy[v]==-1||path(cy[v]))//如果y集合中的v元素没有匹配或者是v已经匹配,但是从cy[v]中能够找到一条增广路 50 { 51 cx[u]=v; 52 cy[v]=u; 53 return 1; 54 } 55 } 56 } 57 return 0; 58 } 59 int maxmatch() 60 { 61 int res=0; 62 memset(cx,0xff,sizeof(cx));//初始值为-1表示两个集合中都没有匹配的元素! 63 memset(cy,0xff,sizeof(cy)); 64 for(int i=0;i<=nx;i++) 65 { 66 if(cx[i]==-1) 67 { 68 memset(visited,0,sizeof(visitited)); 69 res+=path(i); 70 } 71 } 72 return res; 73 } 74 //https://www.cnblogs.com/shenben/p/5573788.html
原文地址:https://www.cnblogs.com/xiaobuxie/p/11391871.html
时间: 2024-09-28 09:16:16