Pagini recente » Cod sursa (job #786901) | Cod sursa (job #2641467) | Cod sursa (job #705650) | Cod sursa (job #2604054) | Cod sursa (job #518456)
Cod sursa(job #518456)
// nu uita de smenul lui Puni
using namespace std;
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
#define pb push_back
#define oo 0x3f3f3f3f
struct nod
{
int lg,c;
};
vector<nod> G[210];
ofstream fout("cc.out");
int intr[105][105];
int C[210][210],F[210][210],N,S,surs,D,sink;
int q[210],isinq[210],ante[210],viz[210],d[210];
bool BFS()
{
q[0]=0;
memset(isinq,0,sizeof(isinq));
memset(viz,0,sizeof(viz));
memset(ante,0,sizeof(ante));
int i;
for(i=0;i<=sink;i++)
{
d[i]=oo;
}
d[surs]=0;
q[q[0]]=surs;
isinq[surs]=1;
viz[surs]=1;
vector<nod>::iterator it;
int u,front=0;
while(front<=q[0])
{
u=q[(front%=210)++];
isinq[u]=0;
for(it=G[u].begin();it<G[u].end();it++)
{
if(C[u][it->lg]>F[u][it->lg])
{
if(d[it->lg]>d[u]+it->c)
{
d[it->lg]=it->c+d[u];
ante[it->lg]=u;
viz[it->lg]=1;
if(!isinq[it->lg])
{
isinq[it->lg]=1;
q[0]=(q[0]+1)%210;
q[q[0]]=it->lg;
}
}
}
}
}
return viz[sink];
}
void solve()
{
int flow=0;
int fmin;
int cmin=0;
vector<nod>::iterator it;
int i;
for(flow=0;BFS();)
{
fmin=C[ante[sink]][sink]-F[ante[sink]][sink];
for(i=ante[sink];i!=surs;i=ante[i])
{
fmin=min(fmin,C[ante[i]][i]-F[ante[i]][i]);
}
F[ante[sink]][sink]+=fmin;
F[sink][ante[sink]]-=fmin;
for(i=ante[sink];i!=surs;i=ante[i])
{
F[ante[i]][i]+=fmin;
F[i][ante[i]]-=fmin;
}
cmin+=d[sink]*fmin;
flow+=fmin;
}
//cout<<flow;
fout<<cmin<<"\n";
int sum=0;
for(i=1;i<=S;i++)
{
for(it=G[i].begin();it<G[i].end();it++)
{
if(F[i][it->lg]==1)
{
sum+=it->c;
}
}
}
//fout<<sum<<"\n";
}
void cit()
{
int i,ii;
ifstream fin("cc.in");
fin>>N;
for(i=1;i<=N;i++)
{
for(ii=1;ii<=N;ii++)
{
fin>>intr[i][ii];
C[i][ii+N]=1;
G[i].pb((nod){ii+N,intr[i][ii]});
G[ii+N].pb((nod){i,-intr[i][ii]});
}
}
S=N;
D=N;
sink=1+N+N;
surs=0;
for(i=1;i<=S;i++)
{
C[0][i]=1;
G[0].pb((nod){i,0});
G[i].pb((nod){0,0});
}
for(i=1;i<=D;i++)
{
C[i+N][sink]=1;
G[sink].pb((nod){i+N,0});
G[i+N].pb((nod){sink,0});
}
fin.close();
}
int main()
{
cit();
solve();
fout.close();
return 0;
}