Cod sursa(job #2277764)

Utilizator patcasrarespatcas rares danut patcasrares Data 6 noiembrie 2018 20:16:53
Problema Critice Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.77 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];
int ver[2][DN];
pair<int,int>mc[DN*10];
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];
}
void bfs(int type)
{
    ver[0][1]=ver[1][n]=1;
    if(type==0)
        q.push(1);
    else
        q.push(n);
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        for(auto i:v[nod])
            if(!ver[type][i.x]&&f[nod][i.x]!=cap[nod][i.x])
            {
                ver[type][i.x]=1;
                q.push(i.x);
            }
    }
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        fin>>a>>b>>c;
        mc[i].x=a;
        mc[i].y=b;
        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)
                        r[pr2[nod]]=1;
                    f[pr[nod]][nod]+=fmin;
                    f[nod][pr[nod]]-=fmin;
                    nod=pr[nod];
                }
            }

    }
    bfs(0);
    bfs(1);
    nr=0;
    for(int i=1;i<=m;i++)
        if(((ver[0][mc[i].x]&ver[1][mc[i].y])||(ver[1][mc[i].x]&ver[0][mc[i].y])))
            nr++;
    fout<<nr<<'\n';
    for(int i=1;i<=m;i++)
        if(((ver[0][mc[i].x]&ver[1][mc[i].y])||(ver[1][mc[i].x]&ver[0][mc[i].y])))
            fout<<i<<'\n';
}