Pagini recente » Cod sursa (job #2301926) | Cod sursa (job #415526) | Cod sursa (job #1918008) | Cod sursa (job #2192470) | Cod sursa (job #1529488)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
#define MAX 610
#define INF 1000000000
#define cout fout
int C[MAX][MAX], Ca[MAX][MAX];
typedef vector <int> :: iterator iter;
vector <int> G[MAX];
queue <int> Q;
int n, m, maxflow, dist[MAX], inQ[MAX], F[MAX][MAX], dad[MAX];
int muchie[MAX][MAX];
int bf()
{
int i, nod, flow;
for(i = 1 ; i <= n + m + 1 ; i++)
{
dist[i] = INF;
}
dist[0] = 0;
Q.push(0);
while(Q.size())
{
nod = Q.front();
inQ[nod] = 0;
Q.pop();
for(iter it = G[nod].begin() ; it != G[nod].end() ; it++)
{
if(Ca[nod][*it] > F[nod][*it] && dist[*it] > dist[nod] + C[nod][*it])
{
dist[*it] = dist[nod] + C[nod][*it];
dad[*it] = nod;
if(!inQ[*it])
{
Q.push(*it);
inQ[*it] = 1;
}
}
}
}
//cout << dist[n + m + 1];
if(dist[n + m + 1] == INF)
return 0;
flow = INF;
for(i = n + m + 1 ; i ; i = dad[i])
{
flow = min(flow, Ca[dad[i]][i] - F[dad[i]][i]);
}
for(i = n + m + 1 ; i ; i = dad[i])
{
maxflow += flow * C[dad[i]][i];
F[dad[i]][i] += flow;
F[i][dad[i]] -= flow;
}
return 1;
}
int main()
{
int e, i, x, y, c;
fin >> n >> m >> e;
for(i = 1 ; i <= n ; i++)
{
G[0].push_back(i);
G[i].push_back(0);
C[0][i] = 0;
Ca[0][i] = 1;
}
for(i = 1 ; i <= m ; i++)
{
G[n + i].push_back(n + m + 1);
G[n + m + 1].push_back(n + i);
C[n + i][n + m + 1] = 0;
Ca[n + i][n + m + 1] = 1;
}
for(i = 1 ; i <= e ; i++)
{
fin >> x >> y >> c;
muchie[x][n + y] = i;
G[x].push_back(n + y);
G[n + y].push_back(x);
Ca[x][n + y] = 1;
C[x][n + y] = c;
C[n + y][x] = -c;
}
while(bf())
{
}
int s = 0;
for(i = 1 ; i <= n ; i++)
s += F[0][i];
cout << s << " " << maxflow << "\n";
for(i = 1 ; i <= n ; i++)
{
for(iter it = G[i].begin() ; it != G[i].end() ; it++)
{
if(*it > n && *it <= n + m && F[i][*it])
{
cout << muchie[i][*it] << " ";
}
}
}
}