Cod sursa(job #1941968)

Utilizator Garen456Paun Tudor Garen456 Data 27 martie 2017 18:35:49
Problema Critice Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <fstream>
#include <queue>
#include <algorithm>
#define inf 1000000000
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int d[1001][1001],t[1001],m,n,ac[1001][1001],muc[10005],ct,viz1[10005],md;
bool viz[1001];
queue <int> C;

void BFS()
{
    for(int i=1;i<=n;++i) viz[i]=0;
    C.push(1);
    int i,v; viz[1]=1;
    while(!C.empty())
    {v=C.front();
        C.pop();
        for(i=1;i<=n;++i)
            if(d[v][i]>0 && viz[i]==0 && ac[v][i]>0)
        { t[i]=v;
            viz[i]=1;
            if(i!=n) C.push(i);
        }

    }


}
void Bf()
{  for(int i=1;i<=n;++i) viz[i]=0;
    C.push(1);
    int i,v;
    while(!C.empty())
    {v=C.front();
        C.pop();
        for(i=1;i<=n;++i)
            if(d[v][i]>0 && viz[i]==0)
        { viz[i]=1;
            if(i!=n) C.push(i); //fout<<i<<"\n";
        }
        else if(!md)
        {
         if(d[v][i]==0 && ac[v][i]>0 && viz1[ac[v][i]]==0)  viz1[ac[v][i]]=1;
        }
        else if(d[v][i]==0 && ac[v][i]>0 && viz1[ac[v][i]]==1) muc[++ct]=ac[v][i];


    }
}


int main()
{
    fin>>n>>m;
    int i,x,y,c,fl;
    for(i=1;i<=m;++i)
    {fin>>x>>y>>c;
        d[x][y]=d[y][x]=c;
        ac[x][y]=ac[y][x]=i;
    }
    BFS();
    while(viz[n])
    { fl=inf;
        for(i=1;i<=n;++i)
            if(d[i][n]>0)
        {
            x=i; fl=d[i][n];
            while(x!=1)
            fl=min(fl,d[t[x]][x]),x=t[x];
          d[i][n]-=fl;
           d[n][i]+=fl;
           x=i;
           while(x!=1)
           { d[t[x]][x]-=fl;
              d[x][t[x]]+=fl;
              x=t[x];
           }
        }
        BFS();
    }
    Bf();
    md=1;
    Bf();
    fout<<ct<<"\n";
   sort(muc+1,muc+ct+1);
   for(i=1;i<=ct;++i)
        fout<<muc[i]<<"\n";
    return 0;
}