Pagini recente » Cod sursa (job #1293186) | Cod sursa (job #1756320) | Cod sursa (job #2962277) | Cod sursa (job #2938453) | Cod sursa (job #197380)
Cod sursa(job #197380)
#include <stdio.h>
#include <set>
#include <vector>
#define inf 10000000
#define pb push_back
using namespace std;
int n,s,t;
int flow[202][202];
int cost[202][202];
int cap[202][202];
int prec[202];
int dist[202];
int total;
int gaseste_drum()
{
for(int i=0;i<202;i++)prec[i]=-1;
for(int i=0;i<202;i++)dist[i]=inf;
dist[s]=0;
for(int i=0;i<t;i++)
for(int u=0;u<t+1;u++)
for(int v=0;v<t+1;v++)
if( (cap[u][v] - flow[u][v]) > 0 && dist[v]> dist[u]+cost[u][v] )
{
dist[v]= dist[u]+cost[u][v];
prec[v]=u;
}
if(prec[t]==-1)return 0;
return 1;
}
void pompeaza()
{
int min=10000;
int sum=0;
int v=t;
while(prec[v]!=-1)
{
int u=prec[v];
sum+=cost[u][v];
if(cap[u][v] - flow[u][v] <min) min=cap[u][v] - flow[u][v];
v=u;
}
v=t;
while(prec[v]!=-1)
{
int u=prec[v];
flow[u][v]+=min;
flow[v][u]-=min;
cost[v][u]=-cost[u][v];
v=u;
}
total+=min*sum;
}
int main()
{
FILE *in=fopen("cc.in","r");
FILE *out=fopen("cc.out","w");
fscanf(in,"%d",&n);
memset(cap,0,202*202*4);
memset(flow,0,202*202*4);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
fscanf(in,"%d",&cost[i][n+j]);
cost[n+j][i]=cost[i][n+j];
cap[i][n+j]=1;
cap[n+j][i]=1;
}
s=2*n;
t=2*n+1;
for(int i=0;i<n;i++)
{
cost[s][i]=0;
cap[s][i]=1;
cost[i][s]=0;
cap[i][s]=1;
}
for(int i=0;i<n;i++)
{
cost[t][n+i]=0;
cap[t][n+i]=1;
cost[n+i][t]=0;
cap[n+i][t]=1;
}
while(gaseste_drum())pompeaza();
fprintf(out,"%d",total);
fclose(in);
fclose(out);
return 0;
}