Pagini recente » Cod sursa (job #1112071) | Cod sursa (job #1690141) | Cod sursa (job #2043176) | Cod sursa (job #2973806) | Cod sursa (job #1775781)
#include <iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
const int nmax=210;
vector<int> v[nmax];
queue<int> q;
int cost[nmax],c[nmax][nmax],fl[nmax][nmax],prec[nmax],d[nmax][nmax];
bool inq[nmax],ok;
int i,j,n,sink,source,x,y,rasp,node;
bool bf()
{
for(i=1;i<=sink;i++)
cost[i]=(1<<30),inq[i]=0;
cost[source]=0;
q.push(source);
while(!q.empty())
{
x=q.front();inq[x]=0;q.pop();
for(i=0;i<v[x].size();i++)
{
y=v[x][i];
if(fl[x][y]<c[x][y]||fl[y][x]>0)
{
if(cost[x]+d[x][y]<cost[y])
{
cost[y]=cost[x]+d[x][y];
if(!inq[y]) {inq[y]=1;q.push(y);}
if(fl[x][y]<c[x][y]) prec[y]=x;
else prec[y]=-x;
}
}
}
}
if(cost[sink]!=(1<<30)) return 1;
return 0;
}
int main()
{
ifstream f("cc.in");
ofstream g("cc.out");
f>>n;
source=2*n+1;sink=2*n+2;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
f>>d[i][j+n];
c[i][j+n]=1;
d[j+n][i]=-d[i][j+n];
v[i].push_back(j+n);
v[j+n].push_back(i);
}
for(i=1;i<=n;i++)
{
v[source].push_back(i);
c[source][i]=1;
v[i].push_back(source);
v[i+n].push_back(sink);
c[i+n][sink]=1;
}
ok=1;
while(ok!=0)
{
ok=bf();
if(ok==0) continue;
rasp+=cost[sink];node=sink;
while(node!=source)
{
if(prec[node]>0) fl[prec[node]][node]++;
else fl[node][-prec[node]]--;
node=prec[node];
if(node<0) node*=-1;
}
}
g<<rasp;
return 0;
}