Pagini recente » Cod sursa (job #2683698) | Cod sursa (job #1702542) | Cod sursa (job #2642131) | Cod sursa (job #1048738) | Cod sursa (job #814724)
Cod sursa(job #814724)
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define NMAX 205
#define INF 1000000005
int pred[NMAX],d[NMAX];
int capacitate[NMAX][NMAX];
int flux[NMAX][NMAX],n,m;
int coada[NMAX * NMAX],lungime;
int cost[NMAX][NMAX],sol;
int suma_muchii[NMAX];
int intra[NMAX],iese[NMAX];
int distanta[NMAX][NMAX];
inline int bellman_ford()
{
int i,j,nod;
memset(pred,-1,sizeof(pred));
for(i = 1; i <= 2 * n + 1; i++)
d[i] = INF;
d[0] = 0;
lungime = 1;
coada[1] = 0;
for(i = 1; i <= lungime; i++)
{
nod = coada[i];
for(j = 0; j <= 2 * n + 1; j++)
if(capacitate[nod][j] > flux[nod][j] && d[nod] + cost[nod][j] < d[j])
{
d[j] = d[nod] + cost[nod][j];
coada[++lungime] = j;
pred[j] = nod;
}
}
return d[2 * n + 1] != INF;
}
int main ()
{
int i,j,k,a,b,c,val;
freopen("traseu.in","r",stdin);
freopen("traseu.out","w",stdout);
scanf("%d%d",&n,&m);
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
distanta[i][j] = INF;
for(i = 1; i <= m; i++)
{
scanf("%d%d%d",&a,&b,&c);
intra[a]++;
iese[b]++;
distanta[a][b] = c;
suma_muchii[a] += c;
suma_muchii[b] += c;
}
for(k = 1; k <= n; k++)
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
if(distanta[i][k] + distanta[k][j] < distanta[i][j])
distanta[i][j] = distanta[i][k] + distanta[k][j];
for(i = 1; i <= n; i++)
if(intra[i] > iese[i])
capacitate[0][i] = intra[i] - iese[i];
for(i = 1; i <= n; i++)
if(intra[i] < iese[i])
capacitate[n + i][2 * n + 1] = iese[i] - intra[i];
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
{
capacitate[i][j + n] = INF;
cost[i][j + n] = distanta[i][j];
cost[j + n][i] = -distanta[i][j];
}
while(bellman_ford())
{
val = INF;
for(i = 2 * n + 1; i; i = pred[i])
val = min(val, capacitate[pred[i]][i] - flux[pred[i]][i]);
sol += d[2 * n + 1];
for(i = 2 * n + 1; i; i = pred[i])
{
flux[pred[i]][i] += val;
flux[i][pred[i]] -= val;
}
}
for(i = 1; i <= n; i++)
if(intra[i] == iese[i])
sol += suma_muchii[i];
printf("%d\n",sol);
return 0;
}