Pagini recente » Cod sursa (job #1573594) | Cod sursa (job #2082653) | Cod sursa (job #1165526) | Cod sursa (job #2701838) | Cod sursa (job #1264603)
#include <fstream>
#include <vector>
#include <queue>
#define inf (1<<30)
using namespace std;
ifstream fin ("cmcm.in");
ofstream fout ("cmcm.out");
int c[610][610],f[610][610],muchie[610][610],d[610],t[610],z[610][610];
vector<int> L[610];
int l,r,x,y,C,i,m,minim,sol,cost,j;
queue <int> q;
bool bf () {
int fr,sc,s;
for (int i=0;i<=l+r+1;i++) {
t[i]=0;
d[i]=inf;
}
t[0]=-1;
d[0]=0;
q.push(0);
while (q.size()) {
int x=q.front();
q.pop();
for (int i=0;i<L[x].size();i++) {
fr=L[x][i];sc=z[x][fr];
if (d[x]+sc<d[fr] && c[x][fr]>f[x][fr]) {
d[fr]=d[x]+sc;
t[fr]=x;
q.push(fr);
}
}
}
return (d[l+r+1]!=inf);
}
int main () {
fin>>l>>r>>m;
for (i=1;i<=m;i++) {
fin>>x>>y>>C;
L[x].push_back(l+y);
L[l+y].push_back(x);
c[x][l+y]=1;
z[x][l+y]=C;
z[l+y][x]=-C;
muchie[x][l+y]=muchie[l+y][x]=i;
}
for (i=1;i<=l;i++) {
L[0].push_back(i);
L[i].push_back(0);
c[0][i]=1;
}
for (i=1;i<=r;i++) {
L[i+l].push_back(l+r+1);
L[l+r+1].push_back(i+l);
c[i+l][l+r+1]=1;
}
while (bf()) {
for (i=0;i<L[l+r+1].size();i++) {
x=L[l+r+1][i];
if (t[l+r+1]==x && c[x][l+r+1]>f[x][l+r+1]){
minim=c[x][l+r+1]-f[x][l+r+1];
while (t[x]!=-1){
minim=min(minim,c[t[x]][x]-f[t[x]][x]);
x=t[x];
}
x=L[l+r+1][i];
f[x][l+r+1]+=minim;
f[l+r+1][x]-=minim;
while (t[x]!=-1){
f[t[x]][x]+=minim;
f[x][t[x]]-=minim;
x=t[x];
}
sol+=minim;
cost+=d[l+r+1]*minim;
}
}
}
fout<<sol<<" "<<cost<<"\n";
for (i=1;i<=l;i++)
for (j=0;j<L[i].size()-1;j++)
if (f[i][L[i][j]]==1)
fout<<muchie[i][L[i][j]]<<" ";
return 0;
}