Pagini recente » Cod sursa (job #795491) | Cod sursa (job #317654) | Cod sursa (job #1131781) | Cod sursa (job #3144292) | Cod sursa (job #608871)
Cod sursa(job #608871)
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
#define nmax 610
#define inf 1<<30
int n, m, e, d, cost[nmax][nmax], C[nmax][nmax], f[nmax][nmax], sol, u[nmax], dist[nmax], t[nmax], nr, ind[nmax][nmax];
vector <int> g[nmax];
queue <int> q;
int bellman_ford()
{
int i, nod, v;
for (i=0; i<=d; i++)
{
u[i]=0;
dist[i]=inf;
}
q.push(0);
dist[0]=0;
u[0]=1;
while (!q.empty())
{
nod=q.front();
q.pop();
u[nod]=0;
for (i=0; i<g[nod].size(); i++)
{
v=g[nod][i];
if (C[nod][v]!=f[nod][v])
if (dist[nod]+cost[nod][v]<dist[v])
{
dist[v]=dist[nod]+cost[nod][v];
t[v]=nod;
if (!u[v])
{
q.push(v);
u[v]=1;
}
}
}
}
return dist[d];
}
void flux()
{
int nod, fm, x;
while ((x=bellman_ford())!=inf)
{
nod=d;
fm=inf;
while (nod)
{
fm=min(fm, C[t[nod]][nod]-f[t[nod]][nod]);
nod=t[nod];
}
nod=d;
while (nod)
{
f[t[nod]][nod]+=fm;
f[nod][t[nod]]-=fm;
nod=t[nod];
}
sol+=x*fm;
}
}
int main()
{
freopen("cmcm.in","r",stdin);
freopen("cmcm.out","w",stdout);
scanf("%d %d %d", &n, &m, &e);
int i, x, y, val, j;
for (i=1; i<=e; i++)
{
scanf("%d %d %d", &x, &y, &val);
y+=n;
g[x].push_back(y);
g[y].push_back(x);
cost[x][y]=val;
cost[y][x]=-val;
ind[x][y]=i;
C[x][y]=1;
}
d=n+m+1;
for (i=1; i<=n; i++)
{
g[0].push_back(i);
g[i].push_back(0);
C[0][i]=1;
}
for (i=n+1; i<=n+m; i++)
{
g[i].push_back(d);
g[d].push_back(i);
C[i][d]=1;
}
flux();
for (i=1; i<=n; i++)
for (j=n+1; j<d; j++)
if (C[i][j] && f[i][j]) nr++;
printf("%d %d\n",nr, sol);
for (i=1; i<=n; i++)
for (j=n+1; j<d; j++)
if (C[i][j] && f[i][j]) printf("%d ",ind[i][j]);
}