Cod sursa(job #2395126)

Utilizator andrei32576Andrei Florea andrei32576 Data 2 aprilie 2019 11:36:48
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <bits/stdc++.h>
using namespace std;

#define nmax 1005
#define inf 0x3f3f3f3f

int n, m, i, x, y, cap;
int t[nmax], F[nmax][nmax], C[nmax][nmax], viz[nmax][3];
vector < pair<int, int> > e;
vector <int> G[nmax];

ifstream f("critice.in");
ofstream g("critice.out");

int bfs()
{
    queue <int> q;
    memset(t, 0, sizeof(t));
    q.push(1);
    t[1] = 1;

    while (!q.empty())
    {
        int nod = q.front();
        q.pop();
        if (nod == n)
            continue;
        for (auto &it : G[nod])
            if (!t[it] && F[nod][it] < C[nod][it])
            {
                t[it] = nod;
                q.push(it);
            }
    }

    return (t[n] != 0);
}

void maxFlow()
{
    while (bfs())
    {
        for (auto &it : G[n])
        {
            if (!t[it] || C[it][n] == F[it][n])
                continue;
            t[n] = it;

            int fm = inf;
            for (int nod = n; nod != 1; nod = t[nod])
                fm = min(fm, C[t[nod]][nod] - F[t[nod]][nod]);
            if (!fm)
                continue;
            for (int nod = n; nod != 1; nod = t[nod])
            {
                F[t[nod]][nod] += fm;
                F[nod][t[nod]] -= fm;
            }
        }
    }
}

void vizit(int S, int D, int sens)
{
    queue <int> q;
    q.push(S);
    viz[S][sens] = 1;

    while (!q.empty())
    {
        int nod = q.front();
        q.pop();
        if (nod == D)
            continue;
        for (auto &it : G[nod])
            if (!viz[it][sens] && F[nod][it] < C[nod][it] && F[it][nod] < C[it][nod])
            {
                viz[it][sens] = 1;
                q.push(it);
            }
    }
}

int main()
{
    f>>n>>m;

    for (i=1;i<=m;i++)
    {
        f>>x>>y>>cap;
        e.push_back(make_pair(x, y));
        G[x].push_back(y);
        G[y].push_back(x);
        C[x][y] = cap;
        C[y][x] = cap;
    }

    maxFlow();
    vizit(1, n, 0);
    vizit(n, 1, 1);

    vector<int> sol;

    for (size_t i = 0; i < e.size(); i++)
    {
        int a = e[i].first;
        int b = e[i].second;
        if (F[a][b] == C[a][b] && viz[a][0] && !viz[b][0] && viz[b][1] && !viz[a][1])
        {
            sol.push_back(i + 1);
            continue;
        }
        if (F[b][a] == C[b][a] && viz[b][0] && !viz[a][0] && viz[a][1] && !viz[b][1])
            sol.push_back(i + 1);
    }

    g<<sol.size()<<"\n";
    for (auto &it : sol)
        g<<it<<"\n";

    f.close();
    g.close();
    return 0;
}