Cod sursa(job #2931185)

Utilizator ArseniuVictorStefanArseniu Victor Stefan ArseniuVictorStefan Data 30 octombrie 2022 17:09:02
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream cin("critice.in");
ofstream cout("critice.out");

const int NMAX = 1'000;
const int MMAX = 10'000;

struct edge
{
    int u, v;
};

int n, m;
int capacity[NMAX][NMAX];
short level[NMAX], ptr[NMAX];
vector<int> g[NMAX];
edge edges[MMAX];
vector<int> ans;

int dfs(int u, int flow)
{
    if(u == n - 1)
        return flow;
    
    for(short& i = ptr[u]; i < g[u].size(); i++)
    {
        int v = g[u][i];
        if(level[v] == level[u] + 1 && capacity[u][v] != 0)
        {
            int next = dfs(v, min(flow, capacity[u][v]));
            if(next != 0)
            {
                capacity[u][v] -= next;
                capacity[v][u] += next;
                return next;
            }
        }
    }
    return 0;
}

int main()
{
    cin >> n >> m;
    for(int i = 0; i < m; i++)
    {
        int u, v, w;
        cin >> u >> v >> w;
        u--; v--;
        edges[i] = { u, v };
        capacity[u][v] = w;
        capacity[v][u] = w;
        g[u].push_back(v);
        g[v].push_back(u);
    }

    while(true)
    {
        fill(level, level + n, -1);

        queue<int> Q;
        level[0] = 0;
        Q.push(0);
        while(!Q.empty())
        {
            int u = Q.front();
            Q.pop();
            if(u == n - 1)
                continue;
            
            for(const int& v : g[u])
                if(level[v] == -1 && capacity[u][v] != 0)
                {
                    level[v] = level[u] + 1;
                    Q.push(v);
                }
        }

        if(level[n - 1] == -1)
            break;
        
        fill(ptr, ptr + n, 0);
        while(dfs(0, 0x3f3f3f3f));
    }

    for(int i = 0; i < m; i++)
    {
        auto[u, v] = edges[i];
        if(capacity[u][v] == 0 || capacity[v][u] == 0)
        {
            capacity[u][v]++; capacity[v][u]++;

            fill(level, level + n, 0);

            queue<int> Q;
            level[0] = 1;
            Q.push(0);
            while(!Q.empty())
            {
                int u = Q.front();
                Q.pop();
                if(u == n - 1)
                    break;
                
                for(const int& v : g[u])
                    if(level[v] == 0 && capacity[u][v] != 0)
                    {
                        level[v] = 1;
                        Q.push(v);
                    }
            }

            if(level[n - 1] == 1)
                ans.push_back(i + 1);

            capacity[u][v]--; capacity[v][u]--;
        }
    }

    cout << ans.size() << '\n';
    for(const int& i : ans)
        cout << i << '\n';
    return 0;
}