Pagini recente » Cod sursa (job #1231625) | Cod sursa (job #172568) | Cod sursa (job #1740056) | Cod sursa (job #1263944) | Cod sursa (job #1519414)
#include <fstream>
#include <queue>
#include <vector>
#include <bitset>
#include <iostream>
#define DIM 605
using namespace std;
int N,M,E;
int F[DIM][DIM],C[DIM][DIM],T[DIM],Z[DIM][DIM];
vector <int> v[DIM];
bitset <DIM> U;
queue <int> Q;
int order[DIM][DIM];
int D[DIM];
int final;
int cost,flux;
int edges;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
int bf(){
U.reset();
U[0]=1;
Q.push(0);
for(int i=0;i<=final;i++)
D[i]=0x3f3f3f3f;
D[0]=0;
while(!Q.empty()){
int node = Q.front();
U[node]=0;
Q.pop();
for(int i=0;i<v[node].size();i++){
int vec = v[node][i];
if(C[node][vec] > F[node][vec] && D[vec] > D[node] + Z[node][vec]){
D[vec] = D[node] + Z[node][vec];
T[vec] = node;
if(U[vec]==0){
U[vec] = 1;
Q.push(vec);
}
}
}
}
return D[final]!=0x3f3f3f3f;
}
int main(){
fin >> N >> M >> E;
for(int i=1;i<=E;i++){
int x,y,z;
fin >> x >> y >> z;
C[x][N+y]=1;
Z[x][N+y]=z;
Z[N+y][x]=-z;
order[x][N+y]=i;
order[N+y][x]=i;
v[x].push_back(N+y);
v[N+y].push_back(x);
}
for(int i=1;i<=N;i++){
v[0].push_back(i);
v[i].push_back(0);
C[0][i]=1;
}
final=N+M+1;
for(int i=1;i<=M;i++){
C[i+N][final]=1;
v[i+N].push_back(final);
v[final].push_back(i+N);
}
while(bf()){
int minim = 0x3f3f3f3f;
int u=final;
while(u!=0){
if(minim > C[T[u]][u] - F[T[u]][u])
minim = C[T[u]][u] - F[T[u]][u];
u=T[u];
}
u=final;
flux+=minim;
while(u!=0){
cost += minim * Z[T[u]][u];
F[T[u]][u]+=minim;
F[u][T[u]]-=minim;
u=T[u];
}
}
fout << flux << " " << cost << "\n";
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
if(F[i][j+N]!=0)
fout << order[i][j+N] << " ";
}