http://acm.hdu.edu.cn/showproblem.php?pid=2813 贴个KM二分最小权值匹配的模板 #include <iostream> #include <algorithm> #include <string> #include <map> #pragma warning (disable: 4786) #define MAXN 210 #define INF 0x7fffffff using namespace std ; struct Graph { int vex , next , weight ; } ; Graph G[MAXN * MAXN] ; int first[MAXN] , link[MAXN] , lx[MAXN] , ly[MAXN] , n , m , k ; bool l[MAXN] , r[MAXN] ; void Readin () { int i , v , weight , w ; map <string , int> MyMap ; char s1[30] , s2[30] ; memset (link , -1 , sizeof (link)) ; memset (first , -1 , sizeof (first)) ; for (v = w = 1 , i = 0 ; i < k ; i ++) { scanf ("%s%s%d" , s1 , s2 , &weight) ; if (MyMap[s1] == 0) MyMap[s1] = v ++ ; if (MyMap[s2] == 0) MyMap[s2] = w ++ ; G[i].vex = MyMap[s2] ; G[i].next = first[MyMap[s1]] ; G[i].weight = -weight ; first[MyMap[s1]] = i ; } } void Init () { int i , j ; memset (ly , 0 , sizeof (ly)) ; for (i = 1 ; i <= n ; i ++) for (lx[i] = -INF , j = first[i] ; j != -1 ; j = G[j].next) lx[i] = max (lx[i] , G[j].weight) ; } bool Find (int i) { int j ; l[i] = true ; for (j = first[i] ; j != -1 ; j = G[j].next) if (!r[G[j].vex] && lx[i] + ly[G[j].vex] == G[j].weight) { r[G[j].vex] = true ; if (link[G[j].vex] == -1 || Find (link[G[j].vex])) { link[G[j].vex] = i ; return true ; } } return false ; } void Adjust () { int i , j , dx = INF ; for (i = 1 ; i <= n ; i ++) if (l[i]) { for (j = first[i] ; j != -1 ; j = G[j].next) if (!r[G[j].vex]) dx = min (lx[i] + ly[G[j].vex] - G[j].weight , dx) ; } for (i = 1 ; i <= n ; i ++) if (l[i]) lx[i] -= dx ; for (i = 1 ; i <= m ; i ++) if (r[i]) ly[i] += dx ; } void Comp () { int i , ans ; for (i = 1 ; i <= n ; i ++) { memset (l , false , sizeof (l)) ; memset (r , false , sizeof (r)) ; while (!Find (i)) { Adjust () ; memset (l , false , sizeof (l)) ; memset (r , false , sizeof (r)) ; } } for (i = 1 , ans = 0 ; i <= m ; i ++) if (link[i] != -1) /*printf ("(%d , %d)/t" , link[i] , i) , */ans -= lx[link[i]] + ly[i] ; printf ("%d/n" , ans) ; } int main () { while (scanf ("%d%d%d" , &n , &m , &k) != EOF) { Readin () ; Init () ; Comp () ; } return 0 ; }