Cod sursa(job #2209097)

Utilizator vladboss2323Ciorica Vlad vladboss2323 Data 1 iunie 2018 18:32:54
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

ifstream in("critice.in");
ofstream out("critice.out");

const int N=1005;
const int INF=2000000000;

int n,m,flux,vmin,s=1,d;

vector<int> a[N];
int sol[N],k;
int m1[N],m2[N];
int f[N][N];
int c[N][N];
int q[2*N];
int pred[N];
bool viz[N],viz2[N];
void citire()
{
    int i,x,y,z;
    in>>n>>m;
    d=n;
    for(i=1; i<=m; i++)
    {
        in>>x>>y>>z;
        m1[i]=x;
        m2[i]=y;
        a[x].push_back(y);
        a[y].push_back(x);
        c[x][y]=z;
        c[y][x]=z;
    }
}

bool bfs()
{
    int st=0,dr=-1,x,y;
    for(x=1; x<=n; x++)
    {
        viz[x]=false;
    }
    q[++dr]=s;
    viz[1]=true;
    while(st<=dr)
    {
        x=q[st++];
        for(y=1; y<=n; y++)
        {
            if(!viz[y] && c[x][y]>f[x][y])
            {
                q[++dr] = y;
                viz[y] = true;
                pred[y] = x;
                if (y == d)
                {
                    return true;
                }
            }
        }
    }
    return false;
}

int drum_minim()
{
    int x = d, vmin = INF;
    while (x != s)
    {
        vmin = min(vmin, c[pred[x]][x] - f[pred[x]][x]);
        x = pred[x];
    }
    return vmin;
}

void actualizare_drum(int vmin)
{
    int x = d;
    while (x != s)
    {
        f[pred[x]][x] += vmin;
        f[x][pred[x]] -= vmin;
        x = pred[x];
    }
}

void dfss(int nod)
{
    int i,vecin;
    viz[nod]=true;
    for(i=0; i<a[nod].size(); i++)
    {
        vecin=a[nod][i];
        if(viz[vecin]==false && c[nod][vecin]>f[nod][vecin])
            dfss(vecin);
    }
}

void dfsd(int nod)
{
    int i,vecin;
    viz2[nod]=true;
    for(i=0; i<a[nod].size(); i++)
    {
        vecin=a[nod][i];
        if(viz2[vecin]==false && c[nod][vecin]>f[nod][vecin])
            dfsd(vecin);
    }
}
int modul(int x)
{
    if(x<0)
        return -x;
    return x;
}
void afisare()
{
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
            out<<f[i][j]<<" ";
        out<<'\n';
    }
    out<<'\n';
}
void afisare1()
{
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
            out<<c[i][j]<<" ";
        out<<'\n';
    }
    out<<'\n';
}
int main()
{
    int i,x,y;
    citire();
    while(bfs())
    {
        vmin=drum_minim();
        flux=flux+vmin;
        actualizare_drum(vmin);
    }

    for(i=1; i<=n; i++)
        viz[i]=viz2[i]=false;
    dfss(1);
    dfsd(n);
    /*for(i=1; i<=n; i++)
        out<<viz[i]<<" ";
    out<<endl;
    for(i=1; i<=n; i++)
        out<<viz2[i]<<" ";
    out<<endl;
    */
    //afisare();
   // afisare1();
    for(i=1; i<=m; i++)
    {
        x=m1[i];
        y=m2[i];
        if(modul(f[x][y])==c[x][y] && ((viz[x] && viz2[y])^(viz2[x] && viz[y])))
            sol[++k]=i;
    }
    out<<k<<'\n';
    for(i=1; i<=k; i++)
        out<<sol[i]<<'\n';
    return 0;
}