Pagini recente » Cod sursa (job #316829) | Cod sursa (job #3218330) | Cod sursa (job #1620560) | Cod sursa (job #1687437) | Cod sursa (job #1613087)
#include<cstdio>
#include<vector>
#include<queue>
#define INF 1000000000
using namespace std;
vector<int>L[610];
queue<int>q;
int n,m,p,e,i,j,a,b,aa,s,ss,vmin,c[610][610],x[610][610],w[610][610],d[610],z[610][610],v[610],t[610];
FILE *f,*g;
int bf(){
for(i=1; i<=p; i++){
d[i] = INF;
// v[i] = 0;
t[i] = 0;
}
q.push(0);
d[0] = 0;
v[0] = 1;
t[0] = -1;
while( !q.empty() ){
a = q.front();
q.pop();
//v[a] = 0;
for(int i=0; i<L[a].size(); i++){
b=L[a][i];
if( c[a][b] > w[a][b] && d[b] > d[a] + x[a][b] ){
d[b] = d[a] + x[a][b];
t[b] = a;
// if( !v[b] ){
// v[b] = 1;
q.push(b);
//}
}
}
}
return d[p] != INF;
}
int minim(int a,int b){
if(a<b)
return a;
return b;
}
int main(){
f=fopen("cmcm.in","r");
g=fopen("cmcm.out","w");
fscanf(f,"%d%d%d",&n,&m,&e);
for(i=1;i<=e;i++){
fscanf(f,"%d%d%d",&a,&b,&aa);
L[a].push_back( b + n );
L[ b + n ].push_back(a);
c[a][ b + n ] = 1;
x[a][ b + n ] = aa;
x[ b + n ][a] = -aa;
z[a][ b + n ] = z[ b + n ][a] = i;
}
for(i=1;i<=n;i++){
c[0][i] = 1;
L[0].push_back(i);
L[i].push_back(0);
}
p = n + m + 1;
for(i=1;i<=m;i++){
c[ i + n ][p] = 1;
L[ i + n ].push_back(p);
L[p].push_back( i + n );
}
while( bf() ){
a = t[p];
if( c[a][p] > w[a][p] ){
vmin = c[a][p] - w[a][p];
while( t[a] != -1 ){
vmin = minim( vmin , c[ t[a] ][a] - w[ t[a] ][a] );
a = t[a];
}
a = p;
while( t[a] != -1 ){
w[ t[a] ][a] += vmin;
w[a][ t[a] ] -= vmin;
a = t[a];
}
s += vmin;
ss += d[p]*vmin;
}
}
fprintf(g,"%d %d\n",s,ss);
for(i=1; i<=n; i++ ){
for(j=0; j<L[i].size(); j++ ){
if( w[i][ L[i][j] ] == 1 )
fprintf(g,"%d ",z[i][ L[i][j] ]);
}
}
fclose(f);
fclose(g);
return 0;
}