Pagini recente » Cod sursa (job #2674854) | Cod sursa (job #918422) | Cod sursa (job #536924) | Cod sursa (job #1017558) | Cod sursa (job #1518010)
#include<fstream>
#include<deque>
#include<vector>
#define DIM 705
#define INF 1000000000
using namespace std;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
int Z[DIM][DIM] , C[DIM][DIM] , F[DIM][DIM] , P[DIM][DIM];
int V[DIM] , T[DIM] , D[DIM] ,s,d,n,e,m;
vector<int> L[DIM];
deque<int> q;
int bf(){
int nod,vecin,ok=0;
for(int i=1;i<=d;i++){
D[i]=INF;
}
q.push_back(s);
D[s]=0;
V[s]=1;
while( !q.empty() ){
nod = q.front();
for(int i=0 ; i<L[nod].size() ; i++ ){
vecin=L[nod][i];
if( C[nod][vecin] > F[nod][vecin] && D[vecin] > D[nod] + Z[nod][vecin] ){
D[vecin] = D[nod] + Z[nod][vecin];
T[vecin]=nod;
if( V[vecin] == 0){
V[vecin] = 1;
q.push_back(vecin);
if(vecin == d) ok=1;
}
}
}
q.pop_front();
V[nod]=0;
}
return ok;
}
int x,y,c,minim,flux,cost;
int main(){
fin>>n>>m>>e;
for(int i=1;i<=e;i++){
fin>>x>>y>>c;
//
L[x].push_back(y+n);
L[y+n].push_back(x);
C[x][y+n] = 1;
Z[x][y+n] = c;
Z[y+n][x] = -c;
P[x][y+n] = i;
//
}
for(int i=1; i<=n ;i++ ){
L[0].push_back(i);
L[i].push_back(0);
C[0][i] = 1;
Z[x][0] = Z[0][x] = 0;
}
s=0;
d=n+m+1;
for(int i = 1; i <= m ; i++ ){
L[d].push_back(i+n);
L[i+n].push_back(d);
C[i+n][d]=1;
}
while( bf() == 1 ){
minim = INF;
for( int i = d ; i != s ; i=T[i] ){
minim=min(minim , C[ T[i] ][i] - F[ T[i] ][i] );
}
flux+=minim;
for( int i = d ; i != s ; i=T[i] ){
F[ T[i] ][i] += minim;
F[i][ T[i] ] -= minim;
cost += minim * Z[ T[i] ][i];
}
}
fout<<flux<<" "<<cost<<"\n";
for(int i=1 ; i<=n ; i++ ){
for(int j = n+1 ; j <= m+n ; j++ ){
if( F[i][j] == 1 ){
fout<<P[i][j]<<" ";
}
}
}
return 0;
}