Pagini recente » Cod sursa (job #1271332) | Cod sursa (job #1555747) | Cod sursa (job #1113953) | Cod sursa (job #858735) | Cod sursa (job #1147783)
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <bitset>
#include <queue>
using namespace std;
const int N=605, S=0, D=604, INF=0x3f3f3f3f;
vector <int> G[N];
bitset <N> v;
int C[N][N], F[N][N], Nr[N][N], Cost[N][N], Tr[N], dist[N];
int n, m, e, flow, flow_cost;
bool bellman_ford()
{
int x, fmin, i;
queue <int> Q;
v.reset();
memset(dist, INF, sizeof(dist));
dist[S]=0;
for(Q.push(S);!Q.empty();Q.pop())
{
x=Q.front();
v[x]=0;
for(vector<int>::iterator it=G[x].begin();it!=G[x].end();it++)
{
if(C[x][*it]==F[x][*it]) continue;
if(dist[x]+Cost[x][*it]<dist[*it])
{
dist[*it]=dist[x]+Cost[x][*it];
Tr[*it]=x;
if(!v[*it])
{
v[*it]=1;
Q.push(*it);
}
}
}
}
if(dist[D]==INF) return false;
fmin=INF;
for(i=D;i!=S;i=Tr[i])
{
fmin=min(fmin, C[Tr[i]][i]-F[Tr[i]][i]);
}
for(i=D;i!=S;i=Tr[i])
{
F[Tr[i]][i]+=fmin;
F[i][Tr[i]]-=fmin;
}
flow+=fmin;
flow_cost+=fmin*dist[D];
return true;
}
int main()
{
freopen("cmcm.in", "r", stdin);
freopen("cmcm.out", "w", stdout);
int i, j, x, y, c;
scanf("%d%d%d", &n, &m, &e);
for(i=1;i<=e;i++)
{
scanf("%d%d%d", &x, &y, &c);
y+=n;
G[x].push_back(y);
G[y].push_back(x);
C[x][y]=1;
Cost[x][y]=c;
Cost[y][x]=-c;
Nr[x][y]=i;
}
for(i=1;i<=n;i++)
{
G[S].push_back(i);
G[i].push_back(S);
C[S][i]=1;
}
for(i=n+1;i<=n+m;i++)
{
G[i].push_back(D);
G[D].push_back(i);
C[i][D]=1;
}
while(bellman_ford());
printf("%d %d\n", flow, flow_cost);
for(i=1;i<=n;i++)
{
for(j=n+1;j<=n+m;j++)
{
if(C[i][j]&&F[i][j]) printf("%d ", Nr[i][j]);
}
}
}