Pagini recente » Cod sursa (job #1358759) | Cod sursa (job #1425665) | Cod sursa (job #967108) | Cod sursa (job #317264) | Cod sursa (job #1256582)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define inf 2147000000
using namespace std;
ifstream f("cmcm.in");
ofstream g("cmcm.out");
vector <int> v[605];
queue <int> q;
int n,n2,m;
int s,t,c[605][605],cost[605][605],fol[605][605],mx[50005],my[50005],use[605],ant[605],dmin[605];
int BellmanFord()
{ int i,j,nod,nod2,newc;
for(i=1;i<=t;i++)
{ use[i]=0;
ant[i]=0;
dmin[i]=inf;
}
q.push(s); dmin[s]=0;
while(!q.empty())
{ nod=q.front(); q.pop();
use[nod]=0;
if (nod==t) continue;
for(i=0;i<v[nod].size();i++)
{ nod2=v[nod][i];
newc=dmin[nod]+cost[nod][nod2];
if (fol[nod][nod2]>=c[nod][nod2] || newc>=dmin[nod2]) continue;
dmin[nod2]=newc;
if (!use[nod2]) {q.push(nod2); use[nod2]=1;}
ant[nod2]=nod;
}
}
return (dmin[t]!=inf);
}
void Flux()
{ int i,x,res,sol=0,cmax=0;
while(BellmanFord())
{ x=t; res=inf;
while(ant[x])
{ res=min(res,c[ant[x]][x]-fol[ant[x]][x]);
x=ant[x];
}
x=t; sol+=dmin[t]*res;
while(ant[x])
{ fol[ant[x]][x]+=res;
fol[x][ant[x]]-=res;
x=ant[x];
}
cmax++;
}
g<<cmax<<" "<<sol<<"\n";
for(i=1;i<=m;i++)
if (fol[mx[i]][my[i]+n]>0)
g<<i<<" ";
}
int main()
{ int i,cst,nod,nod2;
f>>n>>n2>>m;
s=n+n2+1; t=s+1;
for(i=1;i<=n;i++)
{
v[s].push_back(i);
c[s][i]=1;
cost[s][i]=0;
}
for(i=1;i<=n2;i++)
{ v[n+i].push_back(t);
c[n+i][t]=1;
cost[n+i][t]=0;
}
for(i=1;i<=m;i++)
{ f>>mx[i]>>my[i]>>cst;
nod=mx[i]; nod2=my[i]+n;
v[nod].push_back(nod2);
v[nod2].push_back(nod);
c[nod][nod2]=1;
cost[nod][nod2]=cst;
cost[nod2][nod]=-cst;
}
Flux();
return 0;
}