Pagini recente » Cod sursa (job #3352066) | Cod sursa (job #3313442) | Monitorul de evaluare | Cod sursa (job #3320121) | Cod sursa (job #2419619)
#include <fstream>
#include <vector>
#include <deque>
#include <bitset>
#include <cstring>
#define DIM 1000
#define INF 2000000000
using namespace std;
ifstream fin ("cmcm.in");
ofstream fout ("cmcm.out");
vector <int> L[DIM];
deque <int> q;
bitset <DIM> viz;
int c[DIM][DIM],f[DIM][DIM],cst[DIM][DIM],mch[DIM][DIM],d[DIM],t[DIM];
int n,m,i,j,x,y,flux,sol,dif,cost,s,dest,e;
inline int bellmanFord(){
for (int i=0;i<=dest;i++)
d[i] = INF;
memset (t,0,sizeof(t));
viz.reset();
q.push_back(s);
viz[s] = 1;
d[s] = 0;
while (!q.empty()){
int nod = q.front();
viz[nod] = 0;
q.pop_front();
for (int i=0;i<L[nod].size();i++){
int vecin = L[nod][i];
if (c[nod][vecin] > f[nod][vecin] && d[nod]+cst[nod][vecin] < d[vecin]){
d[vecin] = d[nod]+cst[nod][vecin];
t[vecin] = nod;
if (!viz[vecin]){
viz[vecin] = 1;
q.push_back(vecin);
}}}}
return (d[dest] != INF);
}
int main (){
fin>>n>>m>>e;
for (i=1;i<=e;i++){
fin>>x>>y>>cost;
L[x].push_back(y+n);
L[y+n].push_back(x);
cst[x][y+n] = cost;
cst[y+n][x] = -cost;
c[x][y+n] = 1;
mch[x][y+n] = 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[i+n].push_back(n+m+1);
L[n+m+1].push_back(i+n);
c[i+n][n+m+1] = 1;
}
s = 0, dest = n+m+1;
while (bellmanFord()){
x = dest;
dif = INF;
while (x != s){
dif = min (dif,c[t[x]][x] - f[t[x]][x]);
x = t[x];
}
flux += dif;
x = dest;
while (x != s){
f[t[x]][x] += dif;
f[x][t[x]] -= dif;
sol += dif*cst[t[x]][x];
x = t[x];
}}
fout<<flux<<" "<<sol<<"\n";
for (i=1;i<=n;i++)
for (j=n+1;j<dest;j++)
if (f[i][j] == 1)
fout<<mch[i][j]<<" ";
return 0;
}