Cod sursa(job #3040970)

Utilizator rARES_4Popa Rares rARES_4 Data 30 martie 2023 18:21:27
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f ("critice.in");
ofstream g ("critice.out");
int n,m;
vector<int>adiacenta[1001];
queue<int>q;
bool viz[1001];
int tati[1001];
int capacitati[1001][1001],critice[1001][1001];
vector<pair<int,int>>muchii;
bool bfs()
{
    for(int i = 1;i<=n;i++)
        viz[i] = 0;
    q.push(1);
    viz[1] = 1;
    while(!q.empty())
    {
        int curent = q.front();
        q.pop();
        if(curent == n)
            continue;
        for(auto x:adiacenta[curent])
        {
            if(!viz[x] &&  capacitati[curent][x]>0)
            {
                q.push(x);
                viz[x] = 1;
                tati[x] = curent;
            }
        }
    }
    if(viz[n])
        return 1;
    return 0;
}
void DFS(int nod)
{
    viz[nod] = 1;
    for(auto x:adiacenta[nod])
    {
        if(!viz[x])
        {
            if(capacitati[nod][x] == 0 || capacitati[x][nod] == 0)
            {
                critice[nod][x]++;
                critice[x][nod]++;
            }
            else
                DFS(x);
        }
    }
}
int main()
{
    f >> n >> m;
    for(int i = 1;i<=m;i++)
    {
        int x,y,capac;
        f >> x >> y >> capac;
        adiacenta[y].push_back(x);
        adiacenta[x].push_back(y);
        capacitati[x][y] = capac;
        capacitati[y][x] = capac;
        muchii.push_back({x,y});
    }
    while(bfs())
    {
        int nod_start = n;
        int flux = (1<<30)-1;
        while(nod_start!=1)
        {
            flux = min(flux,capacitati[tati[nod_start]][nod_start]);
            nod_start = tati[nod_start];
        }
        if(flux==0)
            continue;
        nod_start = n;
        while(nod_start!=1)
        {
            capacitati[tati[nod_start]][nod_start]-=flux;
            capacitati[nod_start][tati[nod_start]]+=flux;
            nod_start = tati[nod_start];
        }
    }
    for(int i = 1;i<=n;i++)
        viz[i] =0;
    DFS(1);
    for(int i = 1;i<=n;i++)
        viz[i] =0;
    DFS(n);
    int cnt = 0;
    for(int i = 0;i<muchii.size();i++)
    {
        if(critice[muchii[i].first][muchii[i].second]==2)
                {
                        cnt++;
                }
    }
    g << cnt<< "\n";
    for(int i = 0;i<muchii.size();i++)
    {
        if(critice[muchii[i].first][muchii[i].second]==2)
                {
                        g << i+1<<'\n';
                }
    }

}