KM

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define N 405
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
inline int read(){
int sum = 0, t = 1; char ch = getchar();
while(ch < '0' || ch > '9'){ if(ch == '-') t = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9'){ sum = sum * 10 + ch - '0'; ch = getchar(); }
return sum * t;
}
int nl, nr, m, n;
int mp[N][N];
int matr[N], matl[N], lnk[N], slack[N];
int lx[N], ly[N], visl[N], visr[N], tag;
void modify(int x){
for(int y = matl[lnk[x]]; x ; x = y, y = matl[lnk[x]])
matl[matr[x] = lnk[x]] = x;
}
void augment(int x){
queue<int>q;
q.push(x);
visl[x] = ++tag;
int d;
for( ; ; ){
while(!q.empty()){
x = q.front(); q.pop();
for(int i = 1; i <= n; i++) if(visr[i] != tag){
d = lx[x] + ly[i] - mp[x][i];
if(!d){
visr[i] = tag;
lnk[i] = x;
if(!matr[i]){ modify(i); return ; }
if(visl[matr[i]] != tag) visl[matr[i]] = tag, q.push(matr[i]);
}
else if(d < slack[i]) slack[i] = d, lnk[i] = x;
}
}
d = inf;
for(int i = 1; i <= n; i++)
if(visr[i] != tag) d = min(d, slack[i]);
for(int i = 1; i <= n; i++)
if(visl[i] == tag) lx[i] -= d;
for(int i = 1; i <= n; i++)
if(visr[i] == tag) ly[i] += d;
else if(slack[i] != inf) slack[i] -= d;
for(int i = 1; i <= n; i++)
if(visr[i] != tag && !slack[i]){
visr[i] = tag;
if(!matr[i]){ modify(i); return ; }
if(visl[matr[i]] != tag) visl[matr[i]] = tag, q.push(matr[i]);
}
}
}
int main(){
nl = read(), nr = read(), m = read();
n = max(nl, nr);
for(int i = 1; i <= m; i++){
int x = read(), y = read(), z = read();
mp[x][y] = z;
}
for(int i = 1; i <= n; i++){
lx[i] = -inf;
for(int j = 1; j <= n; j++)
lx[i] = max(lx[i], mp[i][j]);
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++)
slack[j] = inf, lnk[j] = 0;
augment(i);
}
ll ans = 0;
for(int i = 1; i <= nl; i++)
ans += mp[i][matl[i]];
printf("%lld\n", ans);
for(int i = 1; i <= nl; i++)
printf("%d ", mp[i][matl[i]] ? matl[i] : 0);
printf("\n");
}
posted @ 2017-04-20 14:15  OcahIBye  阅读(241)  评论(0编辑  收藏  举报