Cod sursa(job #2673685)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 17 noiembrie 2020 15:40:44
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.84 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
int n,tata[1005],cap[1005][1005],flow[1005][1005],viz[1005],viz2[1005],j,nod;
vector <int> v[1005];
bool exista_drum(int inceput)
{
    int i;
    queue <int> q;
    for (i=1;i<=n;i++)
    {
        tata[i]=-1;
    }
    tata[inceput]=0;
    q.push(inceput);
    while (!q.empty())
    {
        int curent=q.front();
        q.pop();
        for (int j=0;j<v[curent].size();j++)
        {
            int nod=v[curent][j];
            if (tata[nod]==-1&&cap[curent][nod]>flow[curent][nod])
            {
                tata[nod]=curent;
                if (nod==n)
                {
                    return 1;
                }
                q.push(nod);
            }
        }
    }
    return 0;
}
void dfsinceput (int x)
{
    viz[x]=1;
    for (int j=0;j<v[x].size();j++)
    {
        int nod=v[x][j];
        if (viz[nod]==0&&cap[x][nod]!=flow[x][nod])
        {
            dfsinceput(nod);
        }
    }
}
void dfssfarsit (int x)
{
    int j;
    viz2[x]=1;
    for (j=0;j<v[x].size();j++)
    {
        nod=v[x][j];
        if (viz2[nod]==0&&cap[x][nod]>-flow[x][nod])
        {
            dfssfarsit(nod);
        }
    }
}
struct muchi
{
    int x,y,z;
}muchii[10005];
int m,i,x,y,z,sol;
vector <int> sol1;
int main()
{
    f>>n>>m;
    for (i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        muchii[i]=muchi{x,y,z};
        cap[x][y]=z;
        cap[y][x]=z;
        flow[x][y]=flow[y][x]=0;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    while (exista_drum(1))
    {
        for (i=0;i<v[n].size();i++)
        {
            nod=v[n][i];
            if (tata[nod]==-1||cap[nod][n]<=flow[nod][n])
            {
                continue;
            }
            sol=cap[nod][n]-flow[nod][n];
            while (tata[nod]>0&&nod!=1)
            {
                sol=min(sol,cap[tata[nod]][nod]-flow[tata[nod]][nod]);
                nod=tata[nod];
            }
            if (sol==0)continue;
            nod=v[n][i];
            flow[nod][n]+=sol;
            flow[n][nod]-=sol;
            while (tata[nod]>0&&nod!=1)
            {
                flow[tata[nod]][nod]+=sol;
                flow[nod][tata[nod]]-=sol;
                nod=tata[nod];
            }
        }
    }
    dfsinceput(1);
    dfssfarsit(n);
    for (i=1;i<=m;i++)
    {
        x=muchii[i].x;
        y=muchii[i].y;
        if (cap[x][y]==flow[x][y]&&viz[x]==1&viz2[y]==1)
        {
            sol1.push_back(i);
        }
        else
        if (cap[y][x]==flow[y][x]&&viz[y]==1&&viz2[x]==1)
        {
            sol1.push_back(i);
        }
    }
    g<<sol1.size()<<'\n';
    for (i=0;i<sol1.size();i++)
    {
        g<<sol1[i]<<'\n';
    }
    return 0;
}