Cod sursa(job #2695587)

Utilizator VladAlexandruAnghelache Vlad VladAlexandru Data 13 ianuarie 2021 20:02:21
Problema Critice Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");

int c[1003][1003], f[1003][1003];
int tata[1003];
int v[1003];
int vs[1003];
int vd[1003];
vector<int> rez;
int n,s,d,m;
int muchii[1005][1005];
bool bfs(vector<int> arce[] )
{

    for(int i=1; i<=n; i++)
    {
        tata[i]=0;
        v[i]=0;
    }
    queue<int> q;
    q.push(s);
    v[s]=1;

    while(q.empty()==false)
    {
        int i = q.front();
        q.pop();
        for(auto j : arce[i])
        {
            if(v[j]==0&&c[i][j]-f[i][j]>0)
            {
                q.push(j);
                tata[j] = i;
                v[j] = 1;
                if(j==d)
                    return true;
            }
        }
    }
    return false;
}
void dfs1(int nod,vector<int> arce[])
{
    vs[nod]=1;

    for(auto j: arce[nod])
        if(vs[j]==0&&c[nod][j]>f[nod][j])
            dfs1(j,arce);


}

void dfs2(int nod,vector<int> arce[])
{
    vd[nod]=1;

    for(auto j: arce[nod])
        if(vd[j]==0&&c[nod][j]>f[nod][j]&&c[nod][j]>f[j][nod])
            dfs2(j,arce);

}
int main()
{

    fin>>n>>m;
    vector<int> arce[n+1];
    for(int i=1; i<=m; i++)
    {
        int a1,b1,c1;

        fin>>a1>>b1>>c1;
        arce[a1].push_back(b1);
        arce[b1].push_back(a1);
        c[a1][b1]=c1;
        c[b1][a1]=c1;
        muchii[a1][b1] = i;
        muchii [b1][a1] = i;

    }
    s=1;
    d=n;
    long long flux=0;

    while(bfs(arce)==true)
    {
        for(auto nod : arce[d])
            if(f[nod][d] != c[nod][d] && v[nod])
            {
                tata[d]=nod;
                int flux_lant=INT_MAX;
                int i=d;
                while(i!=s)
                {

                    int j=tata[i];


                    flux_lant=min(flux_lant, c[j][i]-f[j][i]);


                    i=j;

                }

                i=d;
                while(i!=s)
                {

                    int j=tata[i];

                    f[j][i]+=flux_lant;
                    f[i][j]-=flux_lant;
                    i=j;

                }

                flux+=flux_lant;
            }
    }

    dfs1(1,arce);
    dfs2(n,arce);

    for(int i=1;i<=n; i++)
        for(int j=1;j<n;j++)
            if(f[i][j]==c[i][j]&&c[i][j]>0)
               if((vs[i]==1&&vd[j]==1)||(vs[j]==1&&vd[i]==1))
                    rez.push_back(muchii[i][j]);

    fout<<rez.size()<<"\n";

    for(auto it:rez)
    {
        fout<<it<<"\n";
    }
    return 0;
}