Pagini recente » Cod sursa (job #191137) | Cod sursa (job #1648168) | Cod sursa (job #3166420) | Cod sursa (job #1866434) | Cod sursa (job #1266186)
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#define INF 2000000000
using namespace std;
vector<int>L[610];
queue<int>q;
int n,m,e,i,j,a,poz,b,cc,vmin,s,cost,c[610][610],w[610][610],x[610][610],mc[610][610],d[610],t[610];
FILE *f,*g;
int minim(int a,int b){
if(a<b)
return a;
return b;
}
int bf(){
q.push(0);
memset(t,0,sizeof(t));
for(int i=0;i<=n+m+1;i++){
d[i]=INF;
}
d[0]=0;
t[0]=-1;
while(!q.empty()){
poz=q.front();
q.pop();
for(int i=0;i<L[poz].size();i++){
a=L[poz][i];
if(d[a]>d[poz]+x[poz][a]&&c[poz][a]>w[poz][a]){
d[a]=d[poz]+x[poz][a];
q.push(a);
t[a]=poz;
}
}
}
return d[n+m+1]!=INF;
}
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,&cc);
L[a].push_back(b+n);
L[b+n].push_back(a);
c[a][b+n]=1;
x[a][b+n]=cc;
x[b+n][a]=-cc;
mc[a][b+n]=mc[b+n][a]=i;
}
for(i=1;i<=n;i++){
L[0].push_back(i);
L[i].push_back(0);
c[0][i]=1;
}
for(i=1;i<=m;i++){
L[n+m+1].push_back(i+n);
L[i+n].push_back(n+m+1);
c[i+n][n+m+1]=1;
}
while(bf()){
a=t[n+m+1];
if(c[a][n+m+1]>w[a][n+m+1]){
vmin=c[a][n+m+1]-w[a][n+m+1];
while(t[a]!=-1){
vmin=minim(vmin,c[ t[a] ][a]-w[ t[a] ][a]);
a=t[a];
}
a=n+m+1;
while(t[a]!=-1){
w[ t[a] ][a]+=vmin;
w[a][ t[a] ]-=vmin;
a=t[a];
}
s+=vmin;
cost+=d[n+m+1]*vmin;
}
}
fprintf(g,"%d %d\n",s,cost);
for(i=1;i<=n;i++){
for(j=0;j<L[i].size()-1;j++){
if(w[i][ L[i][j] ]==1)
fprintf(g,"%d ",mc[i][ L[i][j] ]);
}
}
fclose(f);
fclose(g);
return 0;
}