Cod sursa(job #2807228)

Utilizator lucriLuchian Cristian lucri Data 23 noiembrie 2021 16:34:49
Problema Critice Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("critice.in");
ofstream out("critice.out");
int n,m,x[10010],y[10010],c[1010][1010],f[1010][1010],z,ant[1010],r[10010];
vector<vector<int>>a;
bool v[1010];
bool drum()
{
    for(int i=2;i<=n;++i)
        v[i]=false;
    v[1]=true;
    queue<int>q;
    q.push(1);
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        if(x==n)
            continue;
        for(auto t:a[x])
        {
            if(v[t]==true||c[x][t]==f[x][t])
                continue;
            q.push(t);
            ant[t]=x;
            v[t]=true;
        }
    }
    return v[n];
}
void umplere()
{
    int fmin;
    while(drum())
    {
        for(auto x:a[n])
        {
            ant[n]=x;
            if(v[x]==false||f[x][n]==c[x][n])
                continue;
            fmin=10010;
            for(int t=n;t!=1;t=ant[t])
                fmin=min(fmin,c[ant[t]][t]-f[ant[t]][t]);
            if(fmin==0)
                continue;
            for(int t=n;t!=1;t=ant[t])
            {
                f[ant[t]][t]+=fmin;
                f[t][ant[t]]-=fmin;
            }
        }
    }
}
int main()
{
    in>>n>>m;
    a.resize(n+5);
    for(int i=1;i<=m;++i)
    {
        in>>x[i]>>y[i]>>z;
        c[x[i]][y[i]]+=z;
        c[y[i]][x[i]]+=z;
        a[x[i]].push_back(y[i]);
        a[y[i]].push_back(x[i]);
    }
    umplere();
    for(int i=1;i<=m;++i)
    {
        if(c[x[i]][y[i]]==f[x[i]][y[i]])
        {
            ++c[x[i]][y[i]];
            if(drum())
                r[++r[0]]=i;
            --c[x[i]][y[i]];
        }
        else if(c[y[i]][x[i]]==f[y[i]][x[i]])
        {
            ++c[y[i]][x[i]];
            if(drum())
                r[++r[0]]=i;
            --c[y[i]][x[i]];
        }
    }
    out<<r[0]<<'\n';
    for(int i=1;i<=r[0];++i)
        out<<r[i]<<'\n';
    return 0;
}