Pagini recente » Cod sursa (job #1438223) | Cod sursa (job #2738768) | Cod sursa (job #2744031) | Cod sursa (job #2149320) | Cod sursa (job #1873521)
#include <bits/stdc++.h>
using namespace std;
ifstream f("traseu.in");
ofstream g("traseu.out");
int n,m,x,y,c,i,j,sol,fr[66],dist[66],T[66],I[66],F[66][66],C[66][66],D[66][66];
queue <int> Q;
bool gasesc_flux()
{
for(i=1;i<=n+1;++i)
{
dist[i]=1<<30;
T[i]=0;
}
Q.push(0);
I[0]=1;
while(!Q.empty())
{
x=Q.front();
Q.pop();
I[x]=0;
for(i=0;i<=n+1;++i)
if(F[x][i]<C[x][i]&&dist[x]+D[x][i]<dist[i])
{
dist[i]=dist[x]+D[x][i];
T[i]=x;
if(!I[i])
{
Q.push(i);
I[i]=1;
}
}
}
if(dist[n+1]==(1<<30)) return 0;
sol+=dist[n+1];
for(x=n+1;x;x=T[x])
++F[T[x]][x],--F[x][T[x]];
return 1;
}
int main()
{
f>>n>>m;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
if(i!=j) D[i][j]=1<<30;
for(i=1;i<=m;++i)
{
f>>x>>y>>c;
D[x][y]=c;
D[y][x]=-c;
++fr[x];
--fr[y];
sol+=c;
}
for(i=1;i<=n;++i)
{
if(fr[i]<0) C[0][i]=-fr[i];
if(fr[i]>0) C[i][n+1]=fr[i];
}
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
if(D[i][j]>0) C[i][j]=1<<30;
while(gasesc_flux());
g<<sol;
return 0;
}