Pagini recente » Cod sursa (job #3279800) | Cod sursa (job #145735) | Cod sursa (job #3289642) | Cod sursa (job #163278) | Cod sursa (job #2971571)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("cmcm.in");
ofstream g ("cmcm.out");
int src = 0 , dst = 0 , n , m , x , y , c , e , cnt = 0;
int viz[750] , tata[750] , cap[750][750] , cost[750][750];
vector < pair <int , int> > v[750];
vector <int> dist;
int dij ()
{
memset (viz , 0 , sizeof (viz));
memset (tata , 0 , sizeof (tata));
dist.assign (n + m + 5 , INT_MAX);
queue <int>coada;
coada.push (src);
viz[src] = 1;
tata[src] = 0;
dist[src] = 0;
while (!coada.empty ())
{
int nod = coada.front ();
viz[nod] = 0;
coada.pop ();
for (int i = 0 ; i < v[nod].size () ; i++)
{
int vecin = v[nod][i].first;
if (cap[nod][vecin] > 0 && dist[vecin] > dist[nod] + cost[nod][vecin])
{
dist[vecin] = dist[nod] + cost[nod][vecin];
tata[vecin] = nod;
if (viz[vecin] == 0)
{
viz[vecin] = 1;
coada.push (vecin);
}
}
}
}
return dist[dst];
}
int flux ()
{
int flow , maxflow = 0;
while (true)
{
int suma = dij ();
if (suma == INT_MAX)
break;
flow = INT_MAX;
for (int j = dst ; j != src ; j = tata[j])
flow = min (flow , cap[tata[j]][j]);
for (int j = dst ; j != src ; j = tata[j])
{
cap[tata[j]][j] -= flow;
cap[j][tata[j]] += flow;
}
maxflow += flow * suma;
}
return maxflow;
}
int main()
{
f >> n >> m >> e;
src = 0;
dst = n + m + 1;
for (int i = 1 ; i <= e ; i++)
{
f >> x >> y >> c;
v[x].push_back (make_pair (y + n , i));
v[y + n].push_back (make_pair (x , i));
cap[x][y + n] = 1;
cost[x][y + n] = c;
cost[y + n][x] = -c;
}
for (int i = 1 ; i <= n ; i++)
{
v[0].push_back (make_pair (i , 0));
v[i].push_back (make_pair (0 , 0));
cap[0][i] = 1;
}
for (int i = 1 ; i <= m ; i++)
{
v[i + n].push_back (make_pair (dst , 0));
v[dst].push_back (make_pair (i + n , 0));
cap[i + n][dst] = 1;
}
int aux = flux ();
for (int i = 1 ; i <= n + m ; i++)
{
for (int j = 0 ; j < v[i].size () ; j++)
{
int vecin = v[i][j].first;
if (cap[i][vecin] == 0 && vecin != src && vecin != dst && i < vecin)
cnt++;
}
}
g << cnt << " " << aux << '\n';;
for (int i = 1 ; i <= n + m ; i++)
{
for (int j = 0 ; j < v[i].size () ; j++)
{
int vecin = v[i][j].first;
if (cap[i][vecin] == 0 && vecin != src && vecin != dst && i < vecin)
g << v[i][j].second <<" ";
}
}
return 0;
}