Cod sursa(job #3348331)

Utilizator Ionut2212Nedelcu Alexandru Ionut Ionut2212 Data 20 martie 2026 20:23:48
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.85 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <sstream>
#include <string>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int n, m;
struct edges{
    int to;
    int maxf;
    int used;
    int rev;
    int ind;
};
vector<vector<edges > > v;
vector<int> level, ptr;
void add_edge(int a, int b, int c, int ind)
{
    v[a].push_back({b,c,0,v[b].size(), ind});
    v[b].push_back({a,c,0,v[a].size()-1, ind});
}
bool bfs(int start, int fin)
{
    fill(level.begin(), level.end(), -1);
    level[start]= 0;
    queue<int> q;
    q.push(start);
    while(!q.empty())
    {
        int nod = q.front();
        q.pop();
        for(int i = 0; i<v[nod].size();i++)
        {
            int vecin = v[nod][i].to;
            int maxf = v[nod][i].maxf;
            int used = v[nod][i].used;
            if(maxf - used > 0 && level[vecin] == -1)
            {
                level[vecin] = level[nod] + 1;
                q.push(vecin);
            }
        }
    }
    return level[fin] != -1;
}
int dfs(int nod, int fin, int c)
{
    if(nod == fin || c == 0) return c;
    for(int &i = ptr[nod]; i<v[nod].size(); i++)
    {
        int vecin = v[nod][i].to;
        int maxf = v[nod][i].maxf;
        int used = v[nod][i].used;
        if(maxf-used == 0 || level[vecin] != level[nod] + 1)
            continue;
        int cp = dfs(vecin, fin, min(c, maxf-used));
        if(cp == 0) continue;
        v[nod][i].used+=cp;
        v[vecin][v[nod][i].rev].used -= cp;
        return cp;
    }
    level[nod] = -1;
    return 0;
}
int viz[100001], ans1[100001];
int main()
{
    fin >> n >> m;

    v.resize(n+ 5);
    level.resize(n + 5);
    ptr.resize(n + 5);

    for(int i = 1; i<=m; i++)
    {
        int a, b, c;
        fin >> a >> b >> c;
        add_edge(a, b, c, i);
    }
    int ans = 0;
    while(bfs(1,n))
    {
        fill(ptr.begin(), ptr.end(), 0);
        int pushed = 0;
        while(pushed = dfs(1,n,1e7))
        {
            ans+=pushed;
        }
    }
    queue<int> q;
    q.push(1);
    viz[1] = 1;
    while(!q.empty())
    {
        int nod = q.front(); q.pop();
        for(int i = 0; i<v[nod].size(); i++)
        {
            int vecin = v[nod][i].to;
            if(viz[vecin] == 0 && v[nod][i].maxf-v[nod][i].used > 0)
            {
                viz[vecin] = 1;
                q.push(vecin);
            }
        }
    }
    int z = 0;
    for(int i = 1; i<=n; i++)
    {
        if(viz[i] == 1)
        for(int j = 0; j<v[i].size(); j++)
        {
            if(viz[v[i][j].to] == 0)
            {
                ans1[++z] = v[i][j].ind;
            }
        }
    }
    fout << z << '\n';
    for(int i = 1; i<=z; i++)
    {
        fout << ans1[i] << '\n';
    }
    return 0;
}