Pagini recente » Cod sursa (job #2140330) | Cod sursa (job #2532874) | Cod sursa (job #1325242) | Cod sursa (job #2337289) | Cod sursa (job #305827)
Cod sursa(job #305827)
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
#define Max 102
#define Inf 0x3f3f3f3f
int cst[2*Max][2*Max];
int N;
int S,D;
int capac[2*Max][2*Max];
vector<int>G[2*Max+5];
int dist[2*Max];
int tata[2*Max];
int Sum;
void read()
{
freopen("cc.in","r",stdin);
freopen("cc.out","w",stdout);
scanf("%d",&N);
int i,j;
for(i=1;i<=N;++i)
for(j=1;j<=N;++j)
{
scanf("%d",&cst[i][N+j]);
cst[N+j][i] = -cst[i][N+j];
G[i].push_back(N+j);
G[N+j].push_back(i);
capac[i][N+j] = 1;
}
S=0; D = 2*N + 1;
for(i=1;i<=N;++i)
{
G[S].push_back(i);
G[i].push_back(S);
cst[S][i] = cst[i][S] = 0;
capac[S][i] = 1;
G[N+i].push_back(D);
G[D].push_back(N+i);
capac[N+i][D] = 1;
cst[N+i][D] = cst[D][N+i] = 0;
}
}
void flux()
{
int x,y,i;
int viz[2*Max];
N = 2*N+1;
queue<int> Q;
for(;;)
{
for(i=1;i<=N;++i) {dist[i] = Inf; viz[i] = 0;}
Q.push(S);
dist[S] = 0;
for(;!Q.empty();Q.pop())
{
x = Q.front();
viz[x] = 0;
for(i=0;i<G[x].size();++i)
{
y=G[x][i];
if(capac[x][y] && dist[y] > dist[x] + cst[x][y])
{
dist[y] = dist[x] + cst[x][y];
tata[y] = x;
if(!viz[y])
{
viz[y] = 1;
Q.push(y);
}
}
}
}
if(dist[D] == Inf) return;
int flmin = Inf;
for(i=D;i!=S;i=tata[i])
if(flmin > capac[tata[i]][i]) flmin = capac[tata[i]][i];
for(i=D;i!=S;i=tata[i])
{
capac[tata[i]][i] -= flmin;
capac[i][tata[i]] += flmin;
}
Sum += dist[D] * flmin;
}
}
int main()
{
read();
flux();
printf("%d\n",Sum);
return 0;
}