Pagini recente » Cod sursa (job #2332490) | Cod sursa (job #2768100) | Cod sursa (job #2327252) | Cod sursa (job #1249396) | Cod sursa (job #2330427)
#include<bits/stdc++.h>
using namespace std;
int n;
const int maxN=65;
priority_queue<pair<int,int> > q;
vector<int> v[maxN];
int c[maxN][maxN],cst[maxN][maxN],pred[maxN],fat[maxN];
const int inf=(1e9);
int dist[maxN],rd[maxN];
int sol;
struct tip
{
int cost,nod;
bool operator<(const tip&other) const
{
return make_pair(cost,nod)>make_pair(other.cost,other.nod);
}
};
set<tip> Set;
bool inSet[maxN];
inline bool dijkstra()
{
for(int i=0;i<=n+1;i++) dist[i]=inf;
dist[0]=0;
rd[0]=0;
inSet[0]=1;
Set.insert({0,0});
while(!Set.empty())
{
set<tip>::iterator it=Set.begin();
int nod=(*it).nod;
inSet[nod]=0;
Set.erase(Set.begin());
for(auto it:v[nod])
{
if(!c[nod][it]) continue;
if(dist[it]>dist[nod]+cst[nod][it]+pred[nod]-pred[it]);
{
tip nr;
nr.cost=-dist[it];
nr.nod=it;
if(inSet[it]) Set.erase(Set.find(nr));
dist[it]=dist[nod]+cst[nod][it]+pred[nod]-pred[it];
rd[it]=rd[nod]+cst[nod][it];
nr.cost=-dist[it];
nr.nod=it;
Set.insert({nr});
inSet[it]=1;
// q.push({-dist[it],it});
fat[it]=nod;
}
}
}
for(int i=0;i<=n+1;i++)
pred[i]=rd[i];
if(dist[n+1]==inf) return 0;
int f=2e9,ans=0;
for(int T=n+1;T!=0;T=fat[T])
{
f=min(f,c[fat[T]][T]);
ans=ans+cst[fat[T]][T];
}
sol=sol+f*rd[n+1];
for(int T=n+1;T!=0;T=fat[T])
{
c[fat[T]][T]-=f;
c[T][fat[T]]+=f;
}
return 1;
}
int m,in[maxN],out[maxN];
int main()
{
freopen("traseu.in","r",stdin);
freopen("traseu.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j) cst[i][j]=inf;
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
cst[x][y]=z;
sol=sol+z;
in[y]++;
out[x]++;
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(cst[i][k] && cst[k][j]) cst[i][j]=min(cst[i][j],cst[i][k]+cst[k][j]);
}
for(int i=1;i<=n;i++)
{
if(in[i]>out[i])
{
v[0].push_back(i);
v[i].push_back(0);
c[0][i]=in[i]-out[i];
}
else
{
v[i].push_back(n+1);
v[n+1].push_back(i);
c[i][n+1]=out[i]-in[i];
}
}
for(int i=1;i<=n;i++)
{
if(in[i]>out[i])
{
for(int j=1;j<=n;j++)
if(in[j]<out[j])
{
v[i].push_back(j);
v[j].push_back(i);
c[i][j]=inf;
cst[j][i]=-cst[i][j];
}
}
}
while(dijkstra());
printf("%d\n",sol);
return 0;
}