Pagini recente » Cod sursa (job #2045226) | Cod sursa (job #609525) | Cod sursa (job #2256952) | Rating UN nume (ferbinio) | Cod sursa (job #2016580)
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int j,flux,cost_flux,n1,n2,m,i,n,x,y,co,c[610][610],ind[610][610],cst[610][610],ans[610],f[610][610],tata[610];
vector<int>g[610];
bool ap[610];
bool bellman()
{
memset(ans,inf,sizeof(ans));
queue<int>q;
q.push(0);
ap[0]=true;
ans[0]=0;
tata[0]=-1;
while(!q.empty())
{
int node=q.front();
q.pop();
ap[node]=false;
for(auto&it:g[node])
if(f[node][it]<c[node][it]&&ans[it]>ans[node]+cst[node][it])
{
ans[it]=ans[node]+cst[node][it];
tata[it]=node;
if(!ap[it])ap[it]=true,q.push(it);
}
}
if(ans[n]!=inf)return true;
return false;
}
void max_flow()
{
while(bellman())
{
int node=n;
int mi=inf;
while(node!=0)
{
mi=min(mi,c[tata[node]][node]-f[tata[node]][node]);
node=tata[node];
}
node=n;
while(node!=0)
{
f[tata[node]][node]+=mi;
f[node][tata[node]]-=mi;
node=tata[node];
}
flux+=mi;
cost_flux+=mi*ans[n];
}
}
int main()
{
freopen("cmcm.in","r",stdin);
freopen("cmcm.out","w",stdout);
scanf("%d%d%d",&n1,&n2,&m);
for(i=1; i<=m; ++i)
{
scanf("%d%d%d",&x,&y,&co);
y+=n1;
g[x].push_back(y);
g[y].push_back(x);
ind[x][y]=ind[y][x]=i;
c[x][y]=1;
cst[x][y]=co;
cst[y][x]=-co;
}
n=n1+n2;
for(i=1; i<=n1; ++i)
{
g[0].push_back(i);
c[0][i]=1;
}
for(i=1; i<=n2; ++i)
{
g[i+n1].push_back(n+1);
c[i+n1][n+1]=1;
}
++n;
max_flow();
printf("%d %d\n",flux,cost_flux);
for(i=1; i<n; ++i)
for(j=1; j<n; ++j)
if(f[i][j]==1)printf("%d ",ind[i][j]);
return 0;
}