Cod sursa(job #2136147)

Utilizator MaaaaaCristina Ma Maaaaa Data 19 februarie 2018 18:16:04
Problema Critice Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.12 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);
///dupa ce aplicam algoritmul pt flux muchiile critice(x, y) sunt acelea cu cap[x][y]=flux[x][y]
///si care sunt continute in minim un drum de la 1 la n in care restul muchiilor de pe drum au cap[x'][y']> flux[x'][y']
int n, m, cap[nmax][nmax], flux[nmax][nmax], l[nmax], viz[nmax], coada[nmax], prim, ultim, k, FLUX;
int crit[mmax], nrcrit;
struct muchii
{
    int x, y;
}muc[mmax];
vector <int> v[nmax];
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;///val maxima capacitate muchie
    for(auto it=v[n].begin(); it!=v[n].end(); ++it)
    {
        mini=10000;
        l[n]=*it; ///fixam noul drum
        ///verificam daca se  poate ameliora
        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;///val maxima capacitate muchie
    for(auto it=v[n].begin(); it!=v[n].end(); ++it)
    {
        mini=10000;
        l[n]=*it; ///fixam noul drum
        ///verificam daca se  poate ameliora
        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;
}
void solutie()
{
    int i;
    for(i=1; i<=m; i++)
        if((cap[muc[i].x][muc[i].y]==flux[muc[i].x][muc[i].y])||(cap[muc[i].y][muc[i].x]==flux[muc[i].y][muc[i].x]))
    {
        cap[muc[i].x][muc[i].y]++;
        cap[muc[i].y][muc[i].x]++;
        bfs();
        if(amelioreaza2())
        {
            nrcrit++;
            crit[nrcrit]=i;
        }
        cap[muc[i].x][muc[i].y]--;
        cap[muc[i].y][muc[i].x]--;
    }
    f2<<nrcrit<<"\n";
    for(i=1; i<=nrcrit; i++)
        f2<<crit[i]<<"\n";
}
int main()
{
    citire();
    dinic();
    solutie();
    ///f2<<FLUX;
    return 0;
}