Cod sursa(job #2136200)

Utilizator Laura_CorneiLaura Maria Cornei Laura_Cornei Data 19 februarie 2018 18:56:12
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.74 kb
#include <fstream>
#include <vector>
#include <string.h>
#include <stdlib.h>
#define nmax 1005
#define mmax 10005
using namespace std;
fstream f1("critice.in", ios::in);
fstream f2("critice.out", ios::out);
int n, m, cap[nmax][nmax], flux[nmax][nmax], l[nmax], viz[nmax], coada[nmax], prim, ultim, k, FLUX, viz1[nmax], viz2[nmax];
int crit[mmax], nrcrit;
struct muchii
{
    int x, y;
}muc[mmax];
vector <int> v[nmax];
void dfs1(int nod)
{
    int vec;
    viz1[nod]=1;
    for(auto it=v[nod].begin(); it!=v[nod].end(); ++it)
    {
        vec=*it;
        if((!viz1[vec])&&(cap[nod][vec]!=flux[nod][vec])&&cap[vec][nod]!=flux[vec][nod])
           dfs1(vec);
    }
}
void dfs2(int nod)
{
    int vec;
    viz2[nod]=1;
    for(auto it=v[nod].begin(); it!=v[nod].end(); ++it)
    {
        vec=*it;
        if((!viz2[vec])&&(cap[nod][vec]!=flux[nod][vec])&&(cap[vec][nod]!=flux[vec][nod]))
           dfs2(vec);
    }
}
void solutie()
{
    ///v1[nod]=1 daca exista drum de la 1 la nod a.i. pt fiecare muchie prin de pe drum fluxul!=capacitatea
    ///v2[nod]=1 daca exista drum de la n la nod ai.i pt  fiecare muchie prin de pe drum fluxul!=capacitatea
    ///muchiile critice sunt acele muchii(x, y) pt care:
    ///exista drum de la 1 la x cu toate muchiile cu fluxul!=capaciatea (viz[x]=1)
    ///exista drum de la n la y cu toate muchiile cu fluxul!=capaciatea (viz2[y]=1)
    ///capacitate[x][y]=flux[x][y]
    dfs1(1);
    dfs2(n);
   for(int i=1; i<=m; i++)
   {
       int x=muc[i].x, y=muc[i].y;
       if(cap[x][y]==flux[x][y])
       {
            if(viz[x]&&viz2[y])
            {
                nrcrit++;
                crit[nrcrit]=i;
            }
       }
       else if(cap[y][x]==flux[y][x])
       {
            if(viz[y]&&viz2[x])
            {
                nrcrit++;
                crit[nrcrit]=i;
            }
       }
   }
    f2<<nrcrit<<"\n";
    for(int i=1; i<=nrcrit; i++)
        f2<<crit[i]<<"\n";
}
void citire()
{
    int i, x, y, c;
    f1>>n>>m;
    for(i=1; i<=m; i++)
    {
        f1>>x>>y>>c;
        muc[i].x=x; muc[i].y=y;
        cap[x][y]=c;
        v[x].push_back(y);
        v[y].push_back(x);
        cap[y][x]=c;
        ///flux[x][y]=flux[y][x]=0;
    }
}
void init()
{
   memset(viz, 0, sizeof(viz));
   prim=ultim=k=1;
   coada[prim]=1;
   viz[1]=1;
}
void  bfs()
{
   int nod;
   init();
   while(k!=0)
   {
       nod=coada[prim];
       prim++;
       k--;
       for(auto it=v[nod].begin(); it!=v[nod].end(); ++it)
           if((!viz[*it])&&(cap[nod][*it]> flux[nod][*it]))
       {
           ultim++;
           k++;
           coada[ultim]=*it;
           l[*it]=nod;
           viz[*it]=1;
       }
   }
}
int amelioreaza()
{
    int ok=0, i, mini;
    for(auto it=v[n].begin(); it!=v[n].end(); ++it)
    {
        mini=10000;
        l[n]=*it;
        for(i=n; i!=1; i=l[i])
            if(mini> cap[l[i]][i]-flux[l[i]][i])
               mini=cap[l[i]][i]-flux[l[i]][i];
        if(mini==0) ;
        else
        {
            ok=1;
            for(i=n; i!=1; i=l[i])
            {
                flux[l[i]][i]+=mini;
                flux[i][l[i]]-=mini;
            }
            FLUX+=mini;
        }
    }
    return ok;
}
void dinic()
{
    bfs();
    while(amelioreaza())
    {
        bfs();
    }
}
int amelioreaza2()
{
    int i, mini;
    for(auto it=v[n].begin(); it!=v[n].end(); ++it)
    {
        mini=10000;
        l[n]=*it;
        for(i=n; i!=1; i=l[i])
            if(mini> cap[l[i]][i]-flux[l[i]][i])
               mini=cap[l[i]][i]-flux[l[i]][i];
        if(mini> 0) return 1;
    }
    return 0;
}
int main()
{
    citire();
    dinic();
    solutie();
    return 0;
}