Pagini recente » Cod sursa (job #391182) | Cod sursa (job #730870) | Cod sursa (job #1418689) | Cod sursa (job #930368) | Cod sursa (job #2695736)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("cmcm.in");
ofstream cout("cmcm.out");
vector<int> v[650];
int cap[650][650];
int cost[650][650],t[650],dmin[650];
int q[130000],viz[650],ind[650][650];
int x,y,c,z,n,m,s,d,i,j,flux,costf,e;
int inf = 2000000000;
int cmin = inf;
bool drum_minim(int s, int d)
{
int st = 1,en=1;
q[st] = s;
t[s]=-1;
dmin[s]=0;
for(int i=1;i<=n+m+1;++i)
dmin[i]=inf;
while(st<=en)
{
int nod = q[st];
++st;
for(int i=0;i<v[nod].size();++i)
{
if(cap[nod][v[nod][i]] > 0
&& dmin[nod] + cost[nod][v[nod][i]] < dmin[v[nod][i]])
{
dmin[v[nod][i]] = dmin[nod] + cost[nod][v[nod][i]];
++en;
q[en]=v[nod][i];
t[v[nod][i]] = nod;
}
}
}
if(dmin[d] != inf) return 1;
return 0;
}
int main()
{
cin>>n>>m>>e;
for(i=1;i<=e;++i)
{
cin>>x>>y>>z;
y+=n;
ind[x][y]=i;
v[x].push_back(y);
cost[x][y]=z;
v[y].push_back(x);
cost[y][x]=-z;
cap[x][y]=1;
cap[y][x]=0;
}
for(i=1;i<=n;++i)
{
v[0].push_back(i);
v[i].push_back(0);
cap[0][i]=1;
cap[i][0]=0;
}
for(i=n+1;i<=n+m;++i)
{
v[n+m+1].push_back(i);
v[i].push_back(n+m+1);
cap[i][n+m+1]=1;
}
s=0;
d=n+m+1;
int nod = d;
while(drum_minim(s,d))
{
nod = d;
cmin = inf;
while(nod != s)
{
cmin = min(cmin,cap[t[nod]][nod]);
nod = t[nod];
}
flux += cmin;
costf += dmin[d]*cmin;
nod = d;
while(nod !=s)
{
cap[nod][t[nod]] += cmin;
cap[t[nod]][nod] -= cmin;
nod = t[nod];
}
}
cout<<flux<<" " << costf<<"\n";
for(i=1;i<=n;++i)
for(j=n+1;j<=n+m;++j)
{
if(cap[i][j] == 0 && cap[j][i]==1)
cout<<ind[i][j]<<" ";
}
return 0;
}