Pagini recente » Cod sursa (job #1493860) | Cod sursa (job #1080475) | Cod sursa (job #2356638) | Istoria paginii runda/iconcurs13 | Cod sursa (job #2479387)
#include <fstream>
#include <deque>
#include <vector>
#include <bitset>
#define DIM 650
#define inf 200000000
using namespace std;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
deque <int> q;
vector <int> L[DIM];
bitset<DIM> v;
int n,x,y,j,l,r,s,d,m,fsol,z,c,nod,vecin,i,fluxmin,gasit,csol;
int cap[DIM][DIM],flux[DIM][DIM],t[DIM],cost[DIM][DIM],dist[DIM],muc[DIM][DIM];
int bf() {
v.reset();
for(int i=1;i<=d;i++)
dist[i]=inf;
dist[s]=0, v[s]=1;
gasit=0;
q.clear();
q.push_back(s);
while(!q.empty()) {
nod=q.front();
q.pop_front();
v[nod]=0;
for (int i=0;i<L[nod].size();i++) {
vecin=L[nod][i];
if (cap[nod][vecin]>flux[nod][vecin]&&dist[vecin]>dist[nod]+cost[nod][vecin]) {
dist[vecin]=dist[nod]+cost[nod][vecin];
t[vecin]=nod;
if (!v[vecin]) {
q.push_back(vecin);
v[vecin]=1;
}
}
}
}
if (dist[d]!=inf)
return 1;
else
return 0;
}
int main() {
fin>>l>>r>>m;
s=0, d=l+r+1;
for (i=1;i<=m;i++) {
fin>>x>>y>>c;
L[x].push_back(l+y);
L[l+y].push_back(x);
cap[x][l+y]=1;
cost[x][l+y]=c;
cost[l+y][x]=-c;
muc[x][l+y]=i;
}
for (i=1;i<=l;i++) {
cap[s][i]=1;
L[s].push_back(i);
L[i].push_back(s);
}
for (i=1;i<=r;i++) {
cap[l+i][d]=1;
L[d].push_back(l+i);
L[l+i].push_back(d);
}
while (bf()) {
nod=d;
fluxmin=inf;
while(nod!=s) {
fluxmin=min(fluxmin,cap[t[nod]][nod]-flux[t[nod]][nod]);
nod=t[nod];
}
nod=d;
while(nod!=s) {
csol+=fluxmin*cost[t[nod]][nod];
flux[t[nod]][nod]+=fluxmin;
flux[nod][t[nod]]-=fluxmin;
nod=t[nod];
}
fsol+=fluxmin;
}
fout<<fsol<<" "<<csol<<"\n";
for (i=1;i<=l;i++)
for (j=l+1;j<=l+r;j++)
if (flux[i][j]==1)
fout<<muc[i][j]<<" ";
}