Cod sursa(job #2691856)

Utilizator iulianarsenoiuArsenoiu Iulian iulianarsenoiu Data 30 decembrie 2020 12:36:59
Problema Critice Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
int n,m,c[1005][1005],F[1005][1005],t[1005];
vector<int> G[1005],rez;
vector<pair<int,int>> e;
bool bfs(int s, int d)
{
    queue<int> q;
    for(int i=1; i<=n; i++)
    {
        t[i]=-1;
    }
    t[s]=0;
    q.push(s);
    while(!q.empty())
    {
        int x = q.front();
        q.pop();
        for(auto it : G[x])
        {
            if(t[it]==-1 && c[x][it]>F[x][it])
            {
                t[it]=x;
                if(it==d)
                {
                    return true;
                }
                q.push(it);
            }
        }
    }
    return false;
}
int max_flow(int s, int d)
{
    int flux = 0;
    while(bfs(s,d))
    {
        for(auto it : G[d])
        {
            int nod = it;
            int add = c[it][d]-F[it][d];
            int dad = t[nod];
            while(nod!=s)
            {
                add = min(add,c[dad][nod]-F[dad][nod]);
                nod = dad;
                dad = t[nod];
            }
            flux+=add;
            F[it][d]+=add;
            F[d][it]-=add;
            nod = it;
            dad = t[nod];
            while(nod!=s)
            {
                F[dad][nod]+=add;
                F[nod][dad]-=add;
                nod = dad;
                dad = t[nod];
            }
        }
    }
    return flux;
}
int main()
{
    f>>n>>m;
    for(int i=1; i<=m; i++)
    {
        int x,y,t;
        f>>x>>y>>t;
        G[x].push_back(y);
        G[y].push_back(x);
        c[x][y]=t;
        c[y][x]=t;
        e.push_back({x,y});
    }
    max_flow(1,n);
    int cnt = 0;
    for(auto it : e)
    {
        ++cnt;
        int x = it.first;
        int y = it.second;
        if(F[x][y]!=c[x][y])
        {
            continue;
        }
        ++c[x][y];
        if(bfs(1,n))
        {
            rez.push_back(cnt);
        }
        --c[x][y];
    }
    g<<rez.size()<<'\n';
    for(auto it : rez)
    {
        g<<it<<'\n';
    }
    return 0;
}