Cod sursa(job #2705340)

Utilizator evelina.nitoiuNitoiu Evelina evelina.nitoiu Data 12 februarie 2021 13:43:35
Problema Critice Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <fstream>
#include <queue>
#include <vector>
#include <bitset>

using namespace std;

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

const int Nmax=1100;
int n, m, i, j, x, y, z, dif, nod, k;
int t[Nmax], c[Nmax][Nmax], flux[Nmax][Nmax], v[2][Nmax], sol[Nmax];
vector<int> L[Nmax];
pair<int, int> mu[10100];
bitset<Nmax> viz;
queue<int> q;

int bfs()
{
    viz.reset();
    q.push(1);
    viz[1]=1;
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        for(auto vecin:L[nod])
            if(!viz[vecin] && c[nod][vecin]>flux[nod][vecin])
            {
                viz[vecin]=1;
                q.push(vecin);
                t[vecin]=nod;
            }
    }
    return viz[n];
}

void bfs2(int nod,int x)
{
    viz.reset();
    viz[nod]=1;
    q.push(nod);
    v[x][nod]=1;
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        for(auto vecin:L[nod])
            if(!viz[vecin] && c[nod][vecin]>max(flux[nod][vecin],-flux[nod][vecin]))
            {
                viz[vecin]=1;
                q.push(vecin);
                v[x][vecin]=1;
            }
    }
}

int main()
{
    in>>n>>m;
    for(i=1;i<=m;i++)
    {
        in>>x>>y>>z;
        L[x].push_back(y);
        L[y].push_back(x);
        c[x][y]=c[y][x]=z;
        mu[i]={x,y};
    }
    while(bfs())
    {
        for(auto vecin:L[n])
        {
            dif=c[vecin][n]-flux[vecin][n];
            if(!viz[vecin]||dif <= 0)
                continue;
            x=vecin;
            while(t[x])
            {
                dif=min(dif,c[t[x]][x]-flux[t[x]][x]);
                x=t[x];
            }

            flux[vecin][n]+=dif;
            flux[n][vecin]-=dif;
            x=vecin;
            while(t[x])
            {
                flux[t[x]][x]+=dif;
                flux[x][t[x]]-=dif;
                x=t[x];
            }
        }
    }
    bfs2(1,0);
    bfs2(n,1);
    for(i=1;i<=m;i++)
    {
        x=mu[i].first;
        y=mu[i].second;
        if((v[0][x] && v[1][y])||(v[1][x] && v[0][y]))
            sol[++k]=i;
    }
    out<<k<<"\n";
    for(i=1;i<=k;i++)
        out<<sol[i]<<"\n";
    return 0;
}