Pagini recente » Cod sursa (job #293206) | Cod sursa (job #2060818) | Cod sursa (job #1763863) | Cod sursa (job #63653) | Cod sursa (job #751490)
Cod sursa(job #751490)
#include<stdio.h>
#include<assert.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int knmax = 1023, ko9k = 900000001;
int verts, source, dest, dad[knmax], vis[knmax], cap[knmax][knmax], cost[knmax][knmax], f[knmax][knmax];
int sol;
void read(){
assert(freopen("cc.in","r",stdin) != NULL);
scanf("%d", &verts);
source = 0;
dest = verts * 2 + 1;
for(int i = 1; i <= verts; ++i)
for(int j = 1; j <= verts; ++j){
int aux;
scanf("%d", &aux);
cost[i][j + verts] = aux;
cap[i][j + verts] = 1;
cap[source][i] = 1;
cap[j + verts][dest] = 1;
}
verts = verts * 2 + 1;
}
void init(){
for(int i = 1; i <= verts; ++i)
vis[i] = ko9k;
vis[source] = 0;
}
int blm(){
init();
int i, now;
queue<int> q;
q.push(source);
while(!q.empty()){
now = q.front();
q.pop();
for(i = 1; i <= verts; ++i)
if(cap[now][i] > f[now][i] && vis[i] > vis[now] + cost[now][i]){
q.push(i);
vis[i] = vis[now] + cost[now][i];
dad[i] = now;
}
}
if(vis[dest] < ko9k)
return 1;
return 0;
}
void solve(){
int i, c_flow;
while(blm()){
c_flow = ko9k;
for(i = dest; i != source; i = dad[i])
c_flow = min(c_flow, cap[dad[i]][i] - f[dad[i]][i]);
for(i = dest; i != source; i = dad[i]){
sol += c_flow * cost[dad[i]][i];
f[dad[i]][i] += c_flow;
f[i][dad[i]] -= c_flow;
}
}
}
void write(){
assert(freopen("cc.out","w",stdout) != NULL);
printf("%d",sol);
}
int main(){
read();
solve();
write();
return 0;
}