Cod sursa(job #2691235)

Utilizator RNedelcuNedelcu Radu RNedelcu Data 27 decembrie 2020 17:21:35
Problema Critice Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.53 kb
#include <iostream>
#include <bits/stdc++.h>
#define MAX 1001
using namespace std;
ifstream in("critice.in");
ofstream out("critice.out");
int N,M,S,F; // Nr noduri, start, finish
vector<int> Graph[MAX];
int capacitate[MAX][MAX];
int flow[MAX][MAX];
int muchii[MAX][MAX];
int tata[MAX];
int bfs()
{
    for(int i=1; i<=N; i++)
        tata[i]=0;
    int que[MAX]; //Nod
    int L=1;
    que[L]= S;
    tata[S]=S;
    for(int i=1; i<=L; i++)
    {
        int cur = que[i];
        for(auto next : Graph[cur])
        {
            if(!tata[next] && (capacitate[cur][next]-flow[cur][next]>0)) // Daca nu e deja vizitat si mai putem creste fluxul
            {
                tata[next] = cur;
                if(next!=F)
                    que[++L]= next;
            }
        }
    }
    if(tata[F])
        return 1;

    return 0;
}
int Karp()
{
    int maxflow =0;
    while(bfs())
    {
        for(auto vecin : Graph[F])
            if(tata[vecin] && capacitate[vecin][F]-flow[vecin][F] >0)
            {
                int currentFlow = 2e9;
                tata[F] = vecin;
                int current = F;
                int previous;
                while(current!=S)
                {
                    previous = tata[current];
                    currentFlow = min(currentFlow, capacitate[previous][current]-flow[previous][current]);
                    current = previous;
                }
                current=F;
                if(currentFlow>0)
                    while(current!=S) //Updatam capacitatile
                    {
                        previous = tata[current];
                        flow[previous][current]+=currentFlow;
                        flow[current][previous]-=currentFlow;
                        current = previous;
                    }
                maxflow+=currentFlow;
            }
    }
    return maxflow;
}
int main()
{
    int x,y,z;
    in>>N>>M;
    S=1;
    F=N;
    for(int i=1; i<=M; i++)
    {
        in>>x>>y>>z;
        Graph[x].push_back(y);
        Graph[y].push_back(x);
        capacitate[x][y] =capacitate[y][x]= z;
        muchii[x][y]=muchii[y][x]=i;
    }

    cout<<Karp();
    vector<int> rez;
    rez.reserve(M);
    for(int i=1; i<=N; i++)
        if(tata[i])
            for(auto j : Graph[i])
                if(tata[j]!=-1 && capacitate[i][j]-flow[i][j]==0 )
                    rez.push_back(muchii[i][j]);
    out<<rez.size()<<'\n';
    for(auto temp: rez)
        out<<temp<<'\n';

    return 0;
}