Cod sursa(job #2942293)

Utilizator NutaAlexandruASN49K NutaAlexandru Data 19 noiembrie 2022 15:00:44
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <fstream>
#include<vector>
#include <algorithm>
#import <cmath>
#import <cassert>
#import <queue>
using namespace std;
vector<vector<int>>f,d,a;
vector<int>t;
int n;
bool bfs()
{
    vector<bool>viz(n+1,0);
    viz[1]=1;
    queue<int>q;q.push(1);
    while(q.size())
    {
        int nod=q.front();
        q.pop();
        for(auto &c:a[nod])
        {
            if(viz[c] || f[nod][c]==0)continue;
            viz[c]=1;
            t[c]=nod;
            if(c!=n)q.push(c);
        }
    }
    return viz[n];
}
vector<int>ok;
void dfs(int nod)
{
    ok[nod]=1;
    for(auto &c:a[nod])
    {
        if(!ok[c])
        {
            if(!f[nod][c] || !f[c][nod])
            {
                d[nod][c]++;
                d[c][nod]++;
            }
            else
            {
                dfs(c);
            }
        }
    }
}
vector<pair<int,int>>q;
main()
{
    ifstream cin("critice.in");
    ofstream cout("critice.out");
    int m;
    cin>>n>>m;
    q.resize(m);
    a.resize(n+1);
    t.resize(n+1);
    for(auto &c:t)
    {
        c=1;
    }
    f=d=vector<vector<int>>(n+1,vector<int>(n+1,0));
    for(auto &s:q)
    {
        int x,y,c;
        cin>>x>>y>>c;
        f[x][y]=f[y][x]=c;
        a[x].push_back(y);
        a[y].push_back(x);
        s={x,y};
    }
    while(bfs())
    {
        for(auto &c:a[n])
        {
            t[n]=c;
            int val=2e9;
            for(int i=n;i!=1;i=t[i])
            {
                val=min(val,f[t[i]][i]);
            }
            for(int i=n;i!=1;i=t[i])
            {
                f[t[i]][i]-=val;
                f[i][t[i]]+=val;
            }
        }
    }
    ok=vector<int>(n+1,0);
    dfs(1);
    ok=vector<int>(n+1,0);
    dfs(n);
    vector<int>rez;
    for(int i=0;i<m;i++)
    {
        if(d[q[i].first][q[i].second]==2)
        {
            rez.push_back(i+1);
        }
    }
    cout<<rez.size()<<'\n';
    for(auto &c:rez)cout<<c<<'\n';

}