Pagini recente » Cod sursa (job #98345) | Cod sursa (job #2945827) | Cod sursa (job #467399) | Cod sursa (job #2259836) | Cod sursa (job #743811)
Cod sursa(job #743811)
#include <fstream>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int N = 1005, M = 5006, inf = 0x3f3f3f3f;
int cap[N][N], flux[N][N], indice[N][N], T[N], critice[M], n;
bool use[N], stanga[N], dreapta[N];
vector<int> Graph[N];
queue<int> Q;
ifstream in("critice.in");
ofstream out("critice.out");
bool reach_bfs(bool use[N], int x, int D)
{
Q.push(x);
use[x] = true;
while (!Q.empty())
{
x = Q.front(); Q.pop();
if (x == D)
return true;
for (vector<int> :: iterator it = Graph[x].begin() ; it != Graph[x].end() ; it++)
if (!use[*it] && flux[x][*it] < cap[x][*it])
{
Q.push(*it);
T[*it] = x;
use[*it] = true;
}
}
return false;
}
bool bfs(int x, int D)
{
memset(use, false, sizeof(use));
memset(T, 0, sizeof(T));
return reach_bfs(use, x, D);
}
void max_flow(int S, int D)
{
while (bfs(S, D))
{
int upt = inf;
for (int i = D ; i != S ; i = T[i])
upt = min(upt, cap[ T[i] ][i] - flux[ T[i] ][i]);
for (int i = D ; i != S ; i = T[i])
{
flux[ T[i] ][i] += upt;
flux[i][ T[i] ] -= upt;
}
}
/*
for (int i = 1 ; i <= n ; i++)
{
for (int j = 1 ; j <= n ; j++)
cout << "( " << flux[i][j] << " / " << cap[i][j] << " ) ";
cout << "\n";
}
*/
}
int main()
{
int m, x, y;
in >> n >> m;
for (int i = 1 ; i <= m ; i++)
{
in >> x >> y;
in >> cap[x][y];
cap[y][x] = cap[x][y];
indice[x][y] = indice[y][x] = i;
Graph[x].push_back(y);
Graph[y].push_back(x);
}
max_flow(1, n);
memset(use, false, sizeof(use));
reach_bfs(stanga, 1, -1);
reach_bfs(dreapta, n, -1);
for (int i = 1 ; i <= n ; i++)
for (int j = 1 ; j <= n ; j++)
if (cap[i][j] && stanga[i] && dreapta[j])
critice[++critice[0]] = indice[i][j];
for (int i = 0 ; i <= critice[0] ; i++)
out << critice[i] << "\n";
return 0;
}