Cod sursa(job #2233875)

Utilizator patcasrarespatcas rares danut patcasrares Data 24 august 2018 17:03:01
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 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];
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;
        for(auto i:v[n])
            if(viz[i.x])
            {
                a++;
                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;
                while(nod!=1)
                {
                    val=cap[pr[nod]][nod]-f[pr[nod]][nod];
                    if(val==fmin&&nr==1)
                        r[pr2[nod]]=1;
                    f[pr[nod]][nod]+=fmin;
                    f[nod][pr[nod]]-=fmin;
                    nod=pr[nod];
                }
            }

    }
    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';
}