Pagini recente » Borderou de evaluare (job #2210039) | Borderou de evaluare (job #519818) | Borderou de evaluare (job #75610) | Borderou de evaluare (job #2390012) | Cod sursa (job #1146773)
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
#define oo 0x3f3f3f3f
using namespace std;
ifstream fin("cc.in");
ofstream fout("cc.out");
vector<int>g[220];
int c[220][220], dst[220], cap[220][220], f[220][220], t[220];
int n, s, d, sol;
bool vis[220];
queue<int>q;
inline bool BellmanFord()
{
q.push(s);
memset(dst,oo,sizeof(dst));
vis[s]=1;
dst[s]=0;
while(!q.empty())
{
int x=q.front(); q.pop();
vis[x]=0;
for(vector<int>::iterator it=g[x].begin(); it<g[x].end(); it++ )
{
if(cap[x][*it]-f[x][*it]>0)
{
int opt=dst[x]+c[x][*it];
if(opt<dst[*it])
{
dst[*it]=opt;
t[*it]=x;
if(!vis[*it])
{
vis[*it]=1;
q.push(*it);
}
}
}
}
}
return (dst[d]!= oo);
}
int main()
{
fin>>n;
for(int i = 1; i<= n; i++ )
{
for(int j = 1; j<= n; j++ )
{
fin>>c[i][n+j];
c[n+j][i]=-c[i][n+j];
g[i].push_back(n+j);
g[n+j].push_back(i);
cap[i][n+j]=1;
}
g[0].push_back(i);
g[n+i].push_back(2*n+1);
cap[n+i][2*n+1]=1;
cap[0][i]=1;
}
s=0;
d=2*n+1;
while(BellmanFord())
{
for(int i = d; i != s; i=t[i])
f[t[i]][i]++, f[i][t[i]]--;
sol+=dst[d];
}
fout<<sol;
fout.close();
fin.close();
return 0;
}