Pagini recente » Cod sursa (job #287046) | Cod sursa (job #2971656) | Cod sursa (job #1044749) | Cod sursa (job #459787) | Cod sursa (job #202178)
Cod sursa(job #202178)
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <algorithm>
#include <utility>
#include <string>
#include <functional>
#include <sstream>
#include <fstream>
#include <iostream>
using namespace std;
#define FOR(i,a,b) for (i=a;i<=b;i++)
#define fori(it,v) for (it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define mp make_pair
#define fs first
#define ss second
#define all(c) c.begin(),c.end()
#define pf push_front
#define popb pop_back
#define popf pop_front
ifstream in("cc.in");
ofstream out("cc.out");
vector<int> dist(300),ver(300);
vector<vector<int> > a(300);
queue<int> q;
int d[300][300],pred[305],cap[300][300],n,cost;
int flux()
{
int nod,creste;
q.push(0);
vector<int>::iterator it;
pred[2*n+1]=0;
fill(all(dist),1<<30);
dist[0]=0;
while (!q.empty())
{
nod=q.front();
fori(it,a[nod])
if (cap[nod][*it]&&dist[nod]+d[nod][*it]<dist[*it])
{
dist[*it]=dist[nod]+d[nod][*it];
pred[*it]=nod;
if(!ver[*it])
{
ver[*it]=1;
q.push(*it);
}
}
q.pop();
ver[nod]=0;
}
if (!pred[2*n+1])
return 0;
nod=2*n+1;
creste=1<<30;
while (nod)
{
creste=min(creste,cap[pred[nod]][nod]);
nod=pred[nod];
}
nod=2*n+1;
cost+=dist[2*n+1];
while (nod)
{
cap[pred[nod]][nod]-=creste;
cap[nod][pred[nod]]+=creste;
nod=pred[nod];
}
return 1;
}
int main()
{
int i,j;
in>>n;
FOR(i,1,n)
FOR(j,n+1,2*n)
{
in>>d[i][j];
d[j][i]=-d[i][j];
a[i].pb(j);
a[j].pb(i);
cap[i][j]=1;
}
FOR(i,1,n)
{
a[i].pb(0);
a[0].pb(i);
cap[0][i]=1;
a[i+n].pb(2*n+1);
a[2*n+1].pb(i+n);
cap[i+n][2*n+1]=1;
}
while (flux());
out<<cost<<'\n';
in.close();
out.close();
return 0;
}