Cod sursa(job #2695331)

Utilizator Johnny07Savu Ioan-Daniel Johnny07 Data 12 ianuarie 2021 15:12:48
Problema Critice Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
const int minn=(1<<30);
vector <int> drum[1001];
int capac[1005][1005];
int vizit[1005],ant[1005],n,m,c[1005];
int sol;
queue <int> q;
int firstNode[1005],secondNode[1005];

void BFS (int node)
{
    int i;
    q.push(node);
    memset(vizit,0,sizeof(vizit));
    memset(ant,0,sizeof(ant));
    vizit[node]=1;
    while (!q.empty())
    {
        node=q.front();
        if (node==n)
        {
            while (!q.empty()) q.pop();
            return;
        }
        q.pop();
        for (i=0; i<drum[node].size(); i++)
        {
            if (vizit[drum[node][i]]==0 && capac[node][drum[node][i]]>0)
            {
                q.push(drum[node][i]);
                vizit[drum[node][i]]=1;
                ant[drum[node][i]]=node;
            }
        }
    }

}

void dfs(int node)
{
    vizit[node] = true;
    for (auto& nextNode : drum[node])
        if (!vizit[nextNode] && capac[node][nextNode])
            dfs(nextNode);
}

int main()
{
    int x,y,z,i,mi;
    f>>n>>m;
    for (i=1; i<=m; i++)
    {
        f>>x>>y>>z;
        drum[x].push_back(y);
        drum[y].push_back(x);
        capac[x][y]=z;
        capac[y][x] = z;

        firstNode[i] = x;
        secondNode[i] = y;

    }
    int aux;
    int estedrum=1;
    while (estedrum==1)
    {
        BFS(1);
        if (vizit[n]==0) break;
        else
        {
            for (i=0; i<drum[n].size(); i++) if (vizit[drum[n][i]]==1)
                {
                    x=drum[n][i];
                    mi=minn;
                    mi=min(capac[drum[n][i]][n],mi);
                    while (ant[x]!=0)
                    {
                        mi=min(mi,capac[ant[x]][x]);
                        x=ant[x];
                    }
                    sol+=mi;
                    x=drum[n][i];
                    while (ant[x]!=0)
                    {
                        capac[ant[x]][x]-=mi;
                        capac[x][ant[x]]+=mi;
                        x=ant[x];
                    }
                    capac[drum[n][i]][n]-=mi;
                    capac[n][drum[n][i]]+=mi;

                }

        }
    }


    memset(vizit,0,sizeof(vizit));


    int ans = 0;

    dfs(1);
    for (i =1 ; i<= m; i++)
        if (vizit[firstNode[i]] != vizit[secondNode[i]])
            ans ++ ;

    g << ans <<"\n";

    for (i = 1; i <= m; i++)
        if (vizit[firstNode[i]] != vizit[secondNode[i]])
            g << i << "\n";


    return 0;
}