Pagini recente » Cod sursa (job #1017851) | Cod sursa (job #496566) | Cod sursa (job #9767) | Cod sursa (job #162004) | Cod sursa (job #403955)
Cod sursa(job #403955)
#include<stdio.h>
#include<vector>
#include<queue>
#define INF 10000001
#define Nmx 205
#define pb push_back
using namespace std;
int n,N,cst[Nmx][Nmx];
int C[Nmx][Nmx],F[Nmx][Nmx],cost[Nmx],prec[Nmx],viz[Nmx];
vector < int > G[Nmx];
struct cmp
{
bool operator()(int i,int j)
{
return cost[i]>cost[j];
}
};
priority_queue < int, vector<int> , cmp > Q;
void citire()
{
scanf("%d",&n);
N=n*2+1;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
scanf("%d",&cst[i][j+n]);
cst[j+n][i]=-cst[i][j+n];
C[i][j+n]=C[0][i]=C[j+n][N]=1;
G[i].pb(j+n);
G[j+n].pb(i);
G[0].pb(i);
G[i].pb(0);
G[j+n].pb(N);
G[N].pb(j+n);
}
}
int dijkstra()
{
for(int i=0;i<=N;++i)
{
cost[i]=INF;
prec[i]=0;
viz[i]=0;
}
cost[0]=0;
viz[0]=1;
Q.push(0);
while(!Q.empty())
{
int nod=Q.top();
Q.pop();
viz[nod]=0;
for(int i=0;i<G[nod].size();++i)
if(C[nod][G[nod][i]]-F[nod][G[nod][i]]>0&&cost[G[nod][i]]>cost[nod]+cst[nod][G[nod][i]])
{
cost[G[nod][i]]=cost[nod]+cst[nod][G[nod][i]];
prec[G[nod][i]]=nod;
if(!viz[G[nod][i]])
{
Q.push(G[nod][i]);
viz[G[nod][i]]=1;
}
}
}
if(cost[N]<INF)
return 1;
return 0;
}
void flux()
{
int sol=0,cupl=0;
while(dijkstra())
{
int i,Vmin=INF;
for(i=N;i!=0;i=prec[i])
Vmin=min(Vmin,C[prec[i]][i]-F[prec[i]][i]);
for(i=N;i!=0;i=prec[i])
{
F[prec[i]][i]+=Vmin;
F[i][prec[i]]-=Vmin;
}
if(Vmin)
{
cupl++;
sol+=cost[N];
}
}
printf("%d\n",sol);
}
int main()
{
freopen("cc.in","r",stdin);
freopen("cc.out","w",stdout);
citire();
flux();
return 0;
}