Cod sursa(job #1521735)

Utilizator GinguIonutGinguIonut GinguIonut Data 10 noiembrie 2015 19:54:41
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <fstream>
#include <vector>
#include <string.h>
#include <limits.h>
#define nMax 1005
#define mMax 10005
#define INF INT_MAX
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
vector<int> G[nMax];
int q[nMax], vizS[nMax], vizD[nMax], V, i, j, nod, fmin, Sol[mMax], h, a, b, TT[nMax], n, C[nMax][nMax], F[nMax][nMax], c, m;
struct muchii
{
    int a;
    int b;
}M[mMax];
int BFS()
{
    memset(vizS, 0, sizeof(vizS));
    q[0]=q[1]=vizS[1]=1;
    for(i=1;i<=q[0];i++)
    {
        nod=q[i];
        if(nod==n)
            continue;
        for(j=0;j<G[nod].size();j++)
        {
            V=G[nod][j];
            if(vizS[V] || C[nod][V]==F[nod][V])
                continue;
            vizS[V]=1;
            q[++q[0]]=V;
            TT[V]=nod;
        }
    }
    return vizS[n];
}
int Drum()
{
    q[0]=q[1]=vizD[n]=1;
    for(i=1;i<=q[0];i++)
    {
        nod=q[i];
        for(j=0;j<G[nod].size();j++)
        {
            V=G[nod][j];
            if(vizD[V] || C[V][nod]==F[V][nod])
                continue;
            vizD[V]=1;
            q[++q[0]]=V;
        }
    }
}
int main()
{
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>a>>b>>c;
        C[a][b]=C[b][a]=c;
        G[a].push_back(b);
        G[b].push_back(a);
        M[i].a=a;
        M[i].b=b;
    }
    for(;BFS();)
    {
        for(i=0;i<G[n].size();i++)
        {
            nod=G[n][i];
            if(!vizS[nod] || C[nod][n]==F[nod][n])
                continue;
            TT[n]=nod;
            fmin=INF;
            for(nod=n;nod!=1;nod=TT[nod])
                fmin=min(fmin, C[TT[nod]][nod]-F[TT[nod]][nod]);
            if(fmin==0)
                continue;
            for(nod=n;nod!=1;nod=TT[nod])
            {
                F[TT[nod]][nod]+=fmin;
                F[nod][TT[nod]]-=fmin;
            }
        }
    }
    Drum();
    for(i=1;i<=m;i++)
    {
        a=M[i].a;
        b=M[i].b;
        if(F[a][b]==C[a][b] || F[b][a]==C[b][a])
        {
            if((vizS[a]==1&&vizD[b]==1) || (vizS[b]==1&&vizD[a]==1))
                Sol[++h]=i;
        }
    }
    fout<<h<<'\n';
    for(i=1;i<=h;i++)
        fout<<Sol[i]<<'\n';
    return 0;
}