Cod sursa(job #3324673)

Utilizator Anul2024Anul2024 Anul2024 Data 22 noiembrie 2025 21:36:28
Problema Critice Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin ("critice.in");
ofstream fout ("critice.out");
const int DIM = 1000, DIMM = 10000;
struct muchie
{
    int nod, pos;
};
muchie t[DIM + 1];
vector <muchie> v[DIM + 1];
int n, m, x[2 * DIMM + 1], y[2 * DIMM + 1], dp[DIM + 1], dp1[DIM + 1], dp2[DIM + 1];
queue <int> q;
int c[2 * DIMM + 1];
vector <int> sol;
void read ()
{
    int p;
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
        v[i].reserve (10);
    for (int i = 0; i < m; i++)
    {
        fin >> x[i] >> y[i] >> p;
        v[x[i]].push_back ({y[i], 2 * i});
        v[y[i]].push_back ({x[i], 2 * i + 1});
        c[2 * i] = c[2 * i + 1] = p;
    }
}
bool bfs ()
{
    for (int i = 1; i <= n; i++)
        dp[i] = 0;
    q.push (1);
    dp[1] = 1e9;
    while (!q.empty ())
    {
        int nod = q.front ();
        q.pop ();
        for (int i = 0; i < (int) v[nod].size (); i++)
        {
            int vecin = v[nod][i].nod;
            int pos = v[nod][i].pos;
            if (dp[vecin] == 0 && c[pos])
            {
                t[vecin] = {nod, pos};
                q.push (vecin);
                dp[vecin] = min (c[pos], dp[nod]);
            }
        }
    }
    return dp[n];
}
void add_flux (int flux)
{
    int nod = n;
    while (nod != 1)
    {
        c[t[nod].pos] -= flux;
        c[t[nod].pos ^ 1] += flux;
        nod = t[nod].nod;
    }
}
void bfs_ok (int nod, int val, int dp[])
{
    dp[nod] = 1;
    q.push (nod);
    while (!q.empty ())
    {
        int nod = q.front ();
        q.pop ();
        for (int i = 0; i < (int) v[nod].size (); i++)
        {
            int vecin = v[nod][i].nod;
            int pos = v[nod][i].pos;
            pos ^= val;
            if (c[pos] && dp[vecin] == 0)
            {
                dp[vecin] = 1;
                q.push (vecin);
            }
        }
    }
}
void solve ()
{
    while (bfs ())
        add_flux (dp[n]);
    /*bfs_ok (1, 0, dp1);
    bfs_ok (n, 1, dp2);
    for (int i = 0; i < m; i++)
    {
        if ((dp1[x[i]] && dp2[y[i]] && c[2 * i] == 0) || (dp1[y[i]] && dp2[x[i]] && c[2 * i + 1] == 0))
            sol.push_back (i + 1);
    }*/
    fout << sol.size () << "\n";
    for (int i = 0; i < (int) sol.size (); i++)
        fout << sol[i] << "\n";
}
int main ()
{
    read ();
    solve ();
    return 0;
}