二分图匹配实例代码及整理

  

<强>二分图匹配实例代码及整理

  

1,匈牙利算法

  1150

二胺         # include   # include   # include   使用名称空间性病;   int m, n, k;   int vis [105];   int mpt [105] [105];   使用int [105];   int匈牙利(int x)   {   for (int i=1; i之前      


  

  

2公里算法
  

  2255

二胺   

看了很多资料都还不是很懂,,先贴别人的模板

        # include   # include   # include   # include   # include   使用名称空间性病;   #定义N 310   int [N] [N]地图;   bool visitx [N], visity [N];   本部分int lx [N] [N];   int [N]匹配;   int n;      bool匈牙利(int u)//匈牙利算法   {   visitx [u]=true;   for (int i=0;我& lt;n;+ + i)   {   如果(!visity[我],,lx (u) + ly[我]==地图(u)[我])   {   visity[我]=true;   如果(匹配[我]==1 | |匈牙利(匹配[我]))   {   匹配[我]=u;   返回true;   }   }   }   返回错误;   }      空白KM_perfect_match ()   {   int温度;   memset (lx 0 sizeof (lx));//初始化顶标   memset (ly 0 sizeof (ly));//ly[我]为0   for (int i=0;我& lt;n;+ + i)//lx[我]为权值最大的边   for (int j=0;j & lt;n;+ + j)   lx[我]=max (lx[我],[我][j])地图;   for (int i=0;我& lt;n;+ + i)//对n个点匹配   {   而(1)   {   memset (visitx,假,sizeof (visitx));   memset (visity,假,sizeof (visity));   如果(匈牙利(i))//匹配成功   打破;//其他匹配失败,找最小值   {   temp=INT_MAX;   for (int j=0;j & lt;n;+ + j)//x在交错树中   如果(visitx [j])   for (int k=0;k & lt;n;+ + k)//y在交错树外   如果(!visity [k],,临时的在lx [j]地图+ ly [k] - [j] [k])   temp=lx [j] + ly [k] - [j] [k]地图;   for (int j=0;j & lt;n;+ + j)//更新顶标   {   如果(visitx [j])   lx [j] -=temp;   如果(visity [j])   ly [j] +=temp;   }   }   }   }   }      int main ()   {   int答;   而(scanf (“% d”,及n) !=EOF)   {   ans=0;   memset(匹配,1,sizeof(匹配));   for (int i=0;我& lt;n;+ + i)   for (int j=0;j & lt;n;+ + j)   scanf (“% d”,和地图[我][j]);   KM_perfect_match ();   for (int i=0;我& lt;n;+ + i)//权值相加   ans +=地图匹配[我]][[我];   printf (" % d \ n”, ans);   }   返回0;   }   之前      

3,多重匹配

  

HDU 3605年逃离

        # include   # include   # include   使用名称空间性病;   整数n, m;   int num [15];   int mpt [100005] [15];   int vis [15];   使用int [15];   int dp [15] [100005];   int匈牙利(int x)   {   for (int i=1; i<=m;我+ +)   {   如果(vis[我]==0,和mpt [x][我]==1)   {   vis[我]=1;   如果使用[我]& lt; num[我])//满足条件   {   dp[我][使用[我]+ +]=x;   返回1;   }//不满足则寻找增广路   (int j=0; j<使用[我];j + +)//看能否回溯一个出去   {   如果(匈牙利(dp[我][j]))   {   dp[我][j]=x;   返回1;   }   }   }   }   返回0;   }   int main ()   {   而(scanf (“% d % d”,, n,和m) !=EOF)   {   for (int i=1; i<=n,我+ +)   {   for (int j=1; j<=m; j + +)   {   scanf (“% d”,和mpt[我][j]);   }   }   for (int i=1; i<=m;我+ +)   scanf (“% d”, num[我]);   int ans=0;   使用memset (0 sizeof(使用);   for (int i=1; i<=n,我+ +)   {   memset (vis 0 sizeof (vis));   如果匈牙利(i) (!)   {   ans=1;   打破;   }   }   如果(ans==0)   {   printf(“是的\ n”);   }   其他printf (“\ n”);   }      返回0;   }   

二分图匹配实例代码及整理