Pagini recente » Statistici Balaita Cosmin (cosminb2003) | Cod sursa (job #346629)
Cod sursa(job #346629)
#include<fstream>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const char iname[]="cc.in";
const char oname[]="cc.out";
const int maxn=205;
const int INF=0x3f3f3f3f;
ifstream f(iname);
ofstream g(oname);
queue<int> Q;
vector<int> E[maxn];
int F[maxn][maxn],C[maxn][maxn],Cost[maxn][maxn],ok,n,m,i,from[maxn],dis[maxn],price,S,D,j;
bool been[maxn];
int BF()
{
//initializam distantele si coada
memset(dis,INF,sizeof(dis));
memset(been,false,sizeof(been));
dis[S]=0;
been[S]=true;
Q.push(S);
//Bellman-Ford
int x;
while(!Q.empty())
{
x=Q.front();
Q.pop();
if(x==D)
continue;
been[x]=false;
for(vector<int>::iterator it=E[x].begin();it!=E[x].end();++it)
if(C[x][*it]-F[x][*it]>0&&dis[x]+Cost[x][*it]<dis[*it])
{
dis[*it]=dis[x]+Cost[x][*it];
from[*it]=x;
if(been[*it]==false)
been[*it]=true,Q.push(*it);
}
}
//adaugam flux si dam cost
if(dis[D]==INF)
return -1;
int mint=INF;
for(int i=D;i!=S;i=from[i])
mint=min(mint,C[from[i]][i]-F[from[i]][i]);
for(int i=D;i!=S;i=from[i])
{
F[from[i]][i]+=mint;
F[i][from[i]]-=mint;
}
return mint*dis[D];
}
int main()
{
f>>n;
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
{
f>>Cost[i][j+n];
Cost[j+n][i]=-Cost[i][j+n];
C[i][j+n]=INF;
C[j+n][i]=0;
E[i].push_back(j+n);
E[j+n].push_back(i);
}
}
S=0;
for(i=1;i<=n;++i)
{
E[i].push_back(S);
E[S].push_back(i);
Cost[S][i]=Cost[i][S]=0;
C[S][i]=1;
C[i][S]=0;
}
D=2*n+1;
for(i=2*n;i>n;--i)
{
E[i].push_back(D);
E[D].push_back(i);
Cost[i][D]=Cost[D][i]=0;
C[i][D]=1;
C[D][i]=0;
}
for(;(ok=BF())>=0;)
price+=ok;
g<<price<<"\n";
f.close();
g.close();
return 0;
}