Cod sursa(job #2233879)

Utilizator patcasrarespatcas rares danut patcasrares Data 24 august 2018 17:24:37
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include<fstream>
#include<iostream>
#include<vector>
#include<queue>
#define DN 1005
#define x first
#define y second
#define pb push_back
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int n,m,a,b,c,cap[DN][DN],viz[DN],pr[DN],f[DN][DN],pr2[DN];
int r[10*DN],nod,fmin,nr,val,fr[10*DN],ma,t;
vector<pair<int,int> >v[DN];
queue<int>q;
int vf()
{
    for(int i=1;i<=n;i++)
        viz[i]=0;
    q.push(1);
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        viz[nod]=1;
        if(nod==n)
            continue;
        for(auto i:v[nod])
            if(!viz[i.x]&&f[nod][i.x]!=cap[nod][i.x])
            {
                viz[i.x]=1;
                pr[i.x]=nod;
                pr2[i.x]=i.y;
                q.push(i.x);
            }
    }
    return viz[n];
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        fin>>a>>b>>c;
        cap[a][b]=cap[b][a]=c;
        v[a].pb({b,i});
        v[b].pb({a,i});
    }
    while(vf())
    {
        a=0;
        ma=0;
        for(auto i:v[n])
            if(viz[i.x])
            {
                pr[n]=i.x;
                nod=n;
                fmin=1e6;
                nr=0;
                while(nod!=1)
                {
                    val=cap[pr[nod]][nod]-f[pr[nod]][nod];
                    if(val<fmin)
                    {
                        fmin=val;
                        nr=1;
                    }
                    else
                        if(val==fmin)
                            nr++;
                    nod=pr[nod];
                }
                nod=n;
                t=0;
                while(nod!=1)
                {
                    t++;
                    val=cap[pr[nod]][nod]-f[pr[nod]][nod];
                    if(val==fmin&&t>ma)
                    {
                        ma=t;
                        a=pr2[nod];
                        //cout<<pr2[nod]<<'\n';
                    }
                    f[pr[nod]][nod]+=fmin;
                    f[nod][pr[nod]]-=fmin;
                    nod=pr[nod];
                }
            }
            //cout<<'\n';
            r[a]=1;
    }
    nr=0;
    for(int i=1;i<=m;i++)
        if(r[i])
            nr++;
    fout<<nr<<'\n';
    for(int i=1;i<=m;i++)
        if(r[i])
            fout<<i<<'\n';
}