Pagini recente » Cod sursa (job #3001323) | Cod sursa (job #2503252) | Cod sursa (job #1222188) | Cod sursa (job #2774606) | Cod sursa (job #2662573)
#define fisier "critice"
#include <fstream>
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");
const int N = 1000, INF = 10000;
int C[N][N], T[N], n;
#include <vector>
std::vector<int> L[N], sol;
#include <bitset>
std::bitset<N> E;
#include <deque>
bool bfs(const bool inv = false, const bool sat = false)
{
E = 0;
(inv? E[n]: E[0]) = true;
for (std::deque<int> D = {inv? n: 0}; D.size(); D.pop_front())
for (int back: L[D.front()])
if (not E[back] and (sat? C[D.front()][back] and C[back][D.front()]: C[D.front()][back]))
{
D.push_back(back);
E[back] = true;
T[back] = D.front();
if (back == (inv? 0: n))
return true;
}
return false;
}
#include <algorithm>
std::bitset<N> A(const bool inv)
{
std::bitset<N> peArb;
std::fill(T, T+n+1, -1);
bfs(inv, true);
T[inv? n: 0] = inv? n: 0;
for (int i = 0; i <= n; i++)
if (T[i] != -1)
peArb[i] = peArb[ T[i] ] = true;
return peArb;
}
#include <utility>
#define x first
#define y second
int main()
{
int m;
in >> n >> m; n--;
std::vector<std::pair<int, int>> mch;
while (m--)
{
int a, b, c;
in >> a >> b >> c;
mch.push_back({--a, --b});
C[a][b] = C[b][a] = c;
L[a].push_back(b);
L[b].push_back(a);
}
while (bfs())
for (int t: L[n])
if (E[t] and C[t][n])
{
int min = C[T[n] = t][n];
for (int i = t; i; i = T[i])
min = std::min(min, C[ T[i] ][i]);
for (int i = n; i; i = T[i])
{
C[ T[i] ][i] -= min;
C[i][ T[i] ] += min;
}
}
auto A0 = A(false), AN = A(true);
for (size_t id = 0; id < mch.size(); id++)
{
int i = mch[id].x, j = mch[id].y;
if ((A0[i] and AN[j] or A0[j] and AN[i]) and (not C[i][j] or not C[j][i]))
sol.push_back(id);
}
out << sol.size() << '\n';
for (int id: sol)
out << id+1 << '\n';
}