Pagini recente » Cod sursa (job #1743715) | Cod sursa (job #2217581) | Cod sursa (job #936417) | Cod sursa (job #1940186) | Cod sursa (job #3183586)
#include <fstream>
#include <iostream>
using namespace std;
ifstream in("cc.in");
ofstream out("cc.out");
int i, j, k, n, v[101][101], c[101][101], fl[101][101], o[101], h[101], cc[10001], p, q, t, l;
long long e=0; //cost total
int main()
{
in >> n;
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
{
in >> k;
//setare costuri
v[i][n + j + 1] = k;
v[n + j + 1][i] = -k;
//setare capacit pe muchia i
c[i][n + j + 1] = 1;
}
for(i=1;i<=n;i++)
{
c[0][i] = c[i + n + 1][n + 1] = 1;
v[0][i] = v[i + n + 1][n + 1] = 0;
}
//BFS
while(1)
{
for(i=1;i<=2*n+1;i++)
{
o[i]=0;
h[i]=10001;
}
h[0]=0;
p=0;
q=0;
cc[q++]=0;
while(p<q)
{
t=cc[p++]; //nod curr
if(t && t <=n) //dc t e nod sursa
{
for(i = n + 1; i <= 2 * n + 1; i++)
if(fl[t][i] < c[t][i] && h[i] > h[t] + v[t][i]) //dc fluxul se poate mari cu muchia t,i
cc[q++] = i, o[i] = t, h[i] = h[t] + v[t][i];
}
else //dc t e nod interm/dest
for(i = 1; i <= n + 1; i++)
if(fl[t][i] < c[t][i] && h[i] > h[t] + v[t][i]) //dc fluxul se poate mari cu muchia t,i
cc[q++] = i, o[i] = t, h[i] = h[t] + v[t][i];
}
//dc exista un drum
if(!o[n+1])
break;
//act mat de flux cu drumul gasit
for(l=n+1;l!=0;l=o[l])
{
fl[o[l]][l]++;
fl[l][o[l]]--;
}
//act costului
e+=h[n + 1];
}
out<<e;
return 0;
}