Cod sursa(job #2602759)

Utilizator dragos231456Neghina Dragos dragos231456 Data 17 aprilie 2020 19:32:27
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <bits/stdc++.h>
#define pb push_back
#define node adjacent[x][i]
//Problema citrice sau cv de genu
//solutie_100p_din_prima_ez

using namespace std;

const int N=1005;

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

vector<int>adjacent[N];
int id[N][N];
int n,m,x,y,c,C[N][N],flow[N][N],mn;
int source=1,maxflow;
int inq[N],q[N],b,k,pre[N];
int cc[N];
int nr,ids[N*10];

void bfs(int x)
{
    for(int i=1;i<=n;++i) inq[i]=0;
    inq[x]=1; q[1]=x; b=0; k=1;
    while(b<k)
    {
        ++b;
        x=q[b];
        for(int i=0;i<adjacent[x].size();++i) if(!inq[node] && C[x][node]-flow[x][node]>0)
        {
            inq[node]=1;
            q[++k]=node;
            pre[node]=x;
        }
    }
}

void bravo9(int x)
{
    if(x==source) return;
    mn=min(mn,C[pre[x]][x]-flow[pre[x]][x]);
    bravo9(pre[x]);
    flow[pre[x]][x]+=mn;
    flow[x][pre[x]]-=mn;
}

void Faci1000Fac1000BravoTieBravoMie(int x)
{
    bool increase_flow=true;
    while(increase_flow)
    {
        increase_flow=false;
        bfs(1);
        for(int i=0;i<adjacent[x].size();++i) if(inq[node] && C[node][x]-flow[node][x]>0)
        {
            mn=C[node][x]-flow[node][x];
            bravo9(node);
            flow[node][x]+=mn;
            flow[x][node]-=mn;
            if(mn) increase_flow=true;
            maxflow+=mn;
        }
    }
}

void dfs_bolund(int x,int t)
{
    cc[x]=t;
    for(int i=0;i<adjacent[x].size();++i) if(!cc[node] && C[x][node] && C[x][node]-flow[x][node]>0)
    {
        dfs_bolund(node,t);
    }
}

void dfs_invers(int x,int t)
{
    cc[x]=t;
    for(int i=0;i<adjacent[x].size();++i) if(!cc[node] && C[node][x] && C[node][x]-flow[node][x]>0)
    {
        dfs_invers(node,t);
    }
}

void VitezaFerrari()
{
    dfs_bolund(1,1);
    dfs_invers(n,2);
    for(int x=1;x<=n;++x)
    {
        for(int i=0;i<adjacent[x].size();++i)
        {
            if(cc[x]==1 && cc[node]==2 && C[x][node])
            {
                ids[id[x][node]]=1;
                ++nr;
            }
        }
    }
}

int main()
{
    f>>n>>m;
    for(int i=1;i<=m;++i)
    {
        f>>x>>y>>c;
        adjacent[x].pb(y);
        adjacent[y].pb(x);
        id[x][y]=i;
        id[y][x]=i;
        C[x][y]=c;
        C[y][x]=c;
    }
    Faci1000Fac1000BravoTieBravoMie(n);
    VitezaFerrari();
    g<<nr<<'\n';
    for(int i=1;i<=m;++i) if(ids[i]) g<<i<<'\n';
    return 0;
}