Pagini recente » Clasament concurs_11 | Istoria paginii runda/katamashhh | Rating Baciu Robert (BRobertM) | Istoria paginii runda/oni_2009_11-12_2 | Cod sursa (job #870373)
Cod sursa(job #870373)
#include<iostream>
#include<fstream>
#include<vector>
#include<string.h>
using namespace std;
#define NMAX 211
#define INF 0x3f3f3f3f
#define pb push_back
vector <int> v[NMAX];
int cap[NMAX][NMAX],cost[NMAX][NMAX],inq[NMAX],d[NMAX],c[NMAX*NMAX],p[NMAX],n;
inline int bellman_ford(int start, int finish)
{
int st,dr,nod;
memset(d,INF,sizeof(d));
memset(inq,0,sizeof(inq));
memset(p,0,sizeof(p));
st=1;
dr=1;
c[st]=start;
inq[start]=1;
d[start]=0;
p[start]=0;
while(st<=dr) {
nod=c[st];
st++;
inq[nod]=0;
for(vector <int> :: iterator it=v[nod].begin();it!=v[nod].end();it++)
if(cap[nod][*it]>=1 && d[*it]>d[nod]+cost[nod][*it]) {
d[*it]=d[nod]+cost[nod][*it];
p[*it]=nod;
if(inq[*it]==0) {
c[++dr]=*it;
inq[*it]=1;
}
}
}
if(d[finish]!=INF) {
for(nod=finish;nod!=start;nod=p[nod]) {
cap[p[nod]][nod]--;
cap[nod][p[nod]]++;
}
return d[finish];
}
return INF;
}
int main ()
{
int n,i,j,cmin,aux;
ifstream f("cc.in");
ofstream g("cc.out");
f>>n;
for(i=1;i<=n;i++)
for(j=n+1;j<=n+n;j++) {
f>>cost[i][j];
cost[j][i]=-cost[i][j];
v[i].pb(j);
v[j].pb(i);
cap[i][j]=1;
}
f.close();
for(i=1;i<=n;i++) {
v[0].pb(i);
v[i].pb(0);
cap[0][i]=1;
}
for(i=n+1;i<=n+n;i++) {
v[i].pb(2*n+1);
v[2*n+1].pb(i);
cap[i][2*n+1]=1;
}
cmin=0;
aux=0;
while(aux!=INF) {
aux=bellman_ford(0,2*n+1);
if(aux!=INF)
cmin=cmin+aux;
}
g<<cmin;
g.close();
return 0;
}