Pagini recente » Cod sursa (job #2565727) | Cod sursa (job #2535599) | Cod sursa (job #2249358) | Cod sursa (job #220615) | Cod sursa (job #1511300)
#include<iostream>
#include<fstream>
#include<vector>
#define maxn 350
#include<cstring>
#define inf 2000000000
#define ll long long
#define maxx 1000010
#include<queue>
using namespace std;
long long dist[maxn],from[maxn],c[maxn][maxn],cost[maxn][maxn],f[maxn][maxn],u[maxn],n,s,t,drum,l,d,m;
vector<int> v[maxn];
queue<int> q;
long long BellmanFord()
{
long long i,j;
//mem
for(i=0;i<=n+n+1;i++)
{
dist[i]=inf;
from[i]=-1;
}
dist[s]=0;
while(!q.empty())
q.pop();
l=1;
q.push(s);
//q[l]=s;
memset(u,0,sizeof(u));
u[s]=1;
while(!q.empty())
{
long long k=q.front();
q.pop();
for(long long j=0;j<v[k].size();j++)
{
if(c[k][v[k][j]]-f[k][v[k][j]]>0 && dist[k] + cost[k][v[k][j]]<dist[v[k][j]])
{
dist[v[k][j]]= dist[k] + cost[k][v[k][j]];
from[v[k][j]]=k;
if(!u[v[k][j]])
{
l++;
q.push(v[k][j]);
u[v[k][j]]=1;
}
}
}
u[k]=0;
}
if(dist[d]!=inf)
{
long long vmin = inf;
drum = 1;
for (i = d; i != s; i = from[i]) vmin = min(vmin, c[from[i]][i] - f[from[i]][i]);
for (i = d; i != s; i = from[i])
{
f[from[i]][i] += vmin;
f[i][from[i]] -= vmin;
}
return vmin * dist[d];
}
return 0;
}
long long flux()
{
long long rez=0;
drum=1;
while(drum)
{
drum=0;
rez+=BellmanFord();
// cout<<rez<<" ";
}
return rez;
}
int main()
{
long long i,x,t,cap,z,y,j;
ifstream cin("cc.in");
ofstream cout("cc.out");
cin>>n;
s=0;
d=n+n+1;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin>>x;
v[i].push_back(n+j);
v[n+j].push_back(i);
c[i][n+j]=inf;
cost[i][n+j]=x;
cost[n+j][i]=-x;
}
}
for(i=1;i<=n;i++)
{
v[0].push_back(i);
v[i].push_back(0);
c[0][i]=1;
v[n+i].push_back(d);
v[d].push_back(n+i);
c[n+i][d]=1;
}
cout<<flux()<<" ";
return 0;
}