Pagini recente » Cod sursa (job #1906744) | Cod sursa (job #1859351) | Cod sursa (job #1606352) | Cod sursa (job #432150) | Cod sursa (job #1467328)
#include <stdio.h>
#include <vector>
#include <queue>
#define MAX 605
#define INF 1<<30
#define min(a, b) (a < b ? a : b)
using namespace std;
vector<int> l[MAX];
int n, m, e, i, j, x, y, z, S, D, Nr, K;
int cost[MAX][MAX], C[MAX][MAX], F[MAX][MAX], Edge[MAX][MAX], Parent[MAX], d[MAX];
bool viz[MAX];
bool bellman();
int main(){
freopen("cmcm.in", "r", stdin);
freopen("cmcm.out", "w", stdout);
scanf("%d%d%d", &n, &m, &e);
for(i = 1; i <= e; i++){
scanf("%d%d%d", &x, &y, &z);
y += n;
l[x].push_back(y);
l[y].push_back(x);
cost[x][y] = z;
cost[y][x] = -z;
C[x][y] = 1;
Edge[x][y] = i;
}
S = 0;
D = m + n + 1;
for(i = 1; i <= n; i++){
l[S].push_back(i);
C[S][i] = 1;
}
for(i = n + 1; i <= m + n; i++){
l[i].push_back(D);
C[i][D] = 1;
}
while(bellman()){
int minim = INF;
int v = D;
while(v != Parent[v]){
int u = Parent[v];
minim = min(minim, C[u][v] - F[u][v]);
v = u;
}
v = D;
while(v != Parent[v]){
int u = Parent[v];
F[u][v] += minim;
F[v][u] -= minim;
v = u;
}
Nr += minim;
K += minim * d[D];
}
printf("%d %d\n", Nr, K);
for(i = 1; i <= n; i++)
for(j = n + 1; j <= n + m; j++)
if(F[i][j])
printf("%d ", Edge[i][j]);
return 0;
}
bool bellman(){
for(i = S; i <= D; i++){
d[i] = INF;
Parent[i] = 0;
viz[i] = false;
}
d[S] = 0;
queue<int> q;
q.push(S);
viz[S] = true;
while(!q.empty()){
int node = q.front();
q.pop();
viz[node] = false;
if(node == D)
continue;
for(vector<int>::iterator it = l[node].begin(); it < l[node].end(); it++)
if(C[node][*it] > F[node][*it] && d[*it] > d[node] + cost[node][*it]){
d[*it] = d[node] + cost[node][*it];
Parent[*it] = node;
if(!viz[*it]){
viz[*it] = true;
q.push(*it);
}
}
}
return d[D] != INF;
}