Pagini recente » Cod sursa (job #2793653) | Monitorul de evaluare | Cod sursa (job #61891) | Cod sursa (job #869733) | Cod sursa (job #476789)
Cod sursa(job #476789)
#include <stdio.h>
#include <vector>
#include <queue>
#define Nmax 305*2
#define pb push_back
#define INF 2147000000
using namespace std;
vector< int > v[Nmax];
queue< int > Q;
int C[Nmax][Nmax],Cost[Nmax][Nmax],F[Nmax][Nmax],M[Nmax][Nmax];
int dist[Nmax],prev[Nmax],inq[Nmax];
int n,m,much,nrm,rez,S,D,ok;
int vm[Nmax];
void bellman(){
vector< int >::iterator it;
int i,f;
for(i=1;i<=n+m+1;++i) dist[i]=INF;
Q.push(S);
while( !Q.empty() ){
f=Q.front(); Q.pop();
inq[f]=0;
for(it=v[f].begin(); it!=v[f].end(); ++it)
if( C[f][*it] > F[f][*it] && dist[*it] > dist[f] + Cost[f][*it] ){
dist[*it] = dist[f] + Cost[f][*it];
prev[*it]=f;
if( ! inq[*it] ){
inq[*it]=1;
Q.push(*it);
}
}
}
if( dist[D] == INF ) return;
for(i=D; i!=S; i=prev[i]){
F[prev[i]][i]++;
F[i][prev[i]]--;
}
ok=1;
rez += dist[D];
}
int main(){
int i,j,x,y,z;
freopen("cmcm.in","r",stdin);
freopen("cmcm.out","w",stdout);
scanf("%d%d%d",&n,&m,&much);
for(i=1;i<=much;++i){
scanf("%d%d%d",&x,&y,&z);
C[x][y+n]=1;
Cost[x][y+n]=z; Cost[y+n][x]=-z;
v[x].pb(y+n);
v[y+n].pb(x);
M[x][y+n]=i; M[y+n][x]=i;
}
S=0; D=n+m+1;
for(i=1;i<=n;++i) C[S][i]=1, v[S].pb(i);
for(i=1;i<=m;++i) C[i+n][D]=1, v[i+n].pb(D);
for(ok=1; ok; ){
ok=0;
bellman();
}
for(i=1;i<=n;++i)
for(j=n+1; j<=n+m; ++j)
if( F[i][j] ) vm[++nrm]=M[i][j];
printf("%d %d\n",nrm,rez);
for(i=1;i<=nrm;++i) printf("%d ",vm[i]);
printf("\n");
fclose(stdin); fclose(stdout);
return 0;
}