摘要:
1 #include<iostream> 2 #include<cstring> 3 #define N 500 4 using namespace std; 5 6 int n,w[N][N]; 7 int lx[N],ly[N],f[N];bool vx[N],vy[N]; 8 9 int Search(int k){10 vx[k]=1;11 12 for(int i=1;i<=n;++i)13 if(!vy[i]&&lx[k]+ly[i]==w[k][i])14 {15 if(f[i]==-1||Search(f[i]))16 ... 阅读全文
摘要:
引用1:KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转化为求完备匹配的问题的。设顶点Xi的顶标为A[i],顶点Yi的顶标为B [i],顶点Xi与Yj之间的边权为w[i,j]。在算法执行过程中的任一时刻,对于任一条边(i,j),A[i]+B[j]>=w[i,j]始终 成立。KM算法的正确性基于以下定理: 若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最大权匹配。 这个定理是显然的。因为对于二分图的任意一个匹配,如果它包含于相等子图,那么它的边权和等于所有顶点的顶标和;如果它有的边不包 阅读全文