Pagini recente » Cod sursa (job #1339591) | Cod sursa (job #2178692) | Cod sursa (job #2045417) | Monitorul de evaluare | Cod sursa (job #744249)
Cod sursa(job #744249)
#include<fstream>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
int n,m,S,D,C[210][210],F[210][210],viz[210],maxflow;
int cost[210][210],sol;
vector <int> G[210];
void Citire()
{
int i,j;
ifstream fin("cc.in");
fin>>n;
S=2*n+1;
D=2*n+2;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
G[i].push_back(n+j);
G[n+j].push_back(i);
C[i][n+j]=1;
fin>>cost[i][n+j];
cost[n+j][i]=-cost[i][n+j];
}
}
fin.close();
}
void Construire_Retea_Transport()
{
int i;
for(i=1;i<=n;i++)
{
G[S].push_back(i);
G[i].push_back(S);
C[S][i]=1;
cost[S][i]=cost[i][S]=0;
}
for(i=1;i<=n;i++)
{
G[n+i].push_back(D);
G[D].push_back(n+i);
C[n+i][D]=1;
cost[n+i][D]=cost[D][n+i]=0;
}
}
bool BFS()
{
int i,x;
int dist[210];
queue <int> Q;
vector <int>::iterator it;
for(i=1;i<=D;i++)
{
dist[i]=2000000000;
viz[i]=0;
}
Q.push(S);
viz[S]=0;
dist[S]=0;
while(!Q.empty())
{
x=Q.front();
Q.pop();
for(it=G[x].begin();it!=G[x].end();it++)
{
if(C[x][*it]>F[x][*it] && dist[*it]>dist[x]+cost[x][*it])
{
dist[*it]=dist[x]+cost[x][*it];
viz[*it]=x;
Q.push(*it);
}
}
}
if(viz[D]==0)
return false;
return true;
}
void Max_Flow()
{
int x,val;
while(1)
{
if(BFS()==false)
return;
val=2000000000;
x=D;
while(viz[x])
{
val=min(val,C[viz[x]][x]-F[viz[x]][x]);
x=viz[x];
}
x=D;
while(viz[x])
{
F[viz[x]][x]+=val;
F[x][viz[x]]-=val;
x=viz[x];
}
maxflow+=val;
}
}
void Determinare_Solutie()
{
int i;
vector <int>::iterator it;
for(i=1;i<=n;i++)
for(it=G[i].begin();it!=G[i].end();it++)
if(F[i][*it]>0)
sol+=cost[i][*it];
}
void Afisare()
{
ofstream fout("cc.out");
fout<<sol<<"\n";
fout.close();
}
int main()
{
Citire();
Construire_Retea_Transport();
Max_Flow();
Determinare_Solutie();
Afisare();
return 0;
}