Cod sursa(job #1206424)

Utilizator pentrusandaPentru Sanda pentrusanda Data 9 iulie 2014 21:51:32
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.63 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

int n,m,x,y,z,c[1005][1005],muchia[10005][2],f[1005][1005],trecut[1005],lista[1005],prec[1005],pos1[1005],pos2[1005],sol;
vector<int> lda[1005];

int main()
{
    ifstream in ("critice.in");
    ofstream out ("critice.out");

    in>>n>>m;

    for (int i=1;i<=m;++i)
    {
        in>>x>>y>>z;
        muchia[i][0]=x; muchia[i][1]=y;
        c[x][y]+=z;
        c[y][x]+=z;
        lda[x].push_back(y);
        lda[y].push_back(x);
    }

    bool advr=1;
    int v,minim;

    while (advr)
    {
        //arborele bfs
        memset(trecut,0,sizeof(trecut));
        trecut[1]=1; lista[0]=1; lista[1]=1;
        for (int i=1;i<=lista[0];++i)
        {
            v=lista[i];
            if (v!=n)
            for (int j=0;j<lda[v].size();++j)
            {
                if (trecut[lda[v][j]]==0 && c[v][lda[v][j]]>f[v][lda[v][j]])
                {
                    ++lista[0]; lista[lista[0]]=lda[v][j]; trecut[lda[v][j]]=1; prec[lda[v][j]]=v;
                }
            }
        }
        //schimba
        if (trecut[n]==1)
        {
            for (int i=0;i<lda[n].size();++i)
            {
                if (trecut[lda[n][i]]==1 && c[lda[n][i]][n]>f[lda[n][i]][n])
                {
                    v=n; minim=c[lda[n][i]][v]-f[lda[n][i]][v]; prec[n]=lda[n][i];

                    while (v!=1)
                    {
                        if (minim>c[prec[v]][v]-f[prec[v]][v]) minim=c[prec[v]][v]-f[prec[v]][v];
                        v=prec[v];
                    }

                    v=n;
                    while (v!=1)
                    {
                        f[prec[v]][v]+=minim;
                        f[v][prec[v]]-=minim;
                        v=prec[v];
                    }
                }
            }
        }else advr=0;
    }


    pos1[1]=1;
    lista[0]=1; lista[1]=1;
    memset(trecut,0,sizeof(trecut));
    trecut[1]=1;
    for (int i=1;i<=lista[0];++i)
    {
        v=lista[i];
        for (int j=0;j<lda[v].size();++j)
        {
            if (f[v][lda[v][j]]!=c[v][lda[v][j]] && trecut[lda[v][j]]==0)
            {
                ++lista[0]; lista[lista[0]]=lda[v][j]; pos1[lda[v][j]]=1; trecut[lda[v][j]]=1;
            }
        }
    }

    pos2[n]=1;
    lista[0]=1; lista[1]=n;
    memset(trecut,0,sizeof(trecut));
    trecut[n]=1;
    for (int i=1;i<=lista[0];++i)
    {
        v=lista[i];
        for (int j=0;j<lda[v].size();++j)
        {
            if (f[lda[v][j]][v]!=c[lda[v][j]][v] && trecut[lda[v][j]]==0)
            {
                ++lista[0]; lista[lista[0]]=lda[v][j]; pos2[lda[v][j]]=1; trecut[lda[v][j]]=1;
            }
        }
    }

        for (int i=1;i<=m;++i)
    {
        if (f[muchia[i][0]][muchia[i][1]]==c[muchia[i][0]][muchia[i][1]])
        {
            if (pos1[muchia[i][0]]==1 && pos2[muchia[i][1]]==1) {++sol;}
        }else
        if (f[muchia[i][1]][muchia[i][0]]==c[muchia[i][1]][muchia[i][0]])
        {
            if (pos1[muchia[i][1]]==1 && pos2[muchia[i][0]]==1) {++sol; }
        }
    }

    out<<sol<<"\n";

    for (int i=1;i<=m;++i)
    {
        if (f[muchia[i][0]][muchia[i][1]]==c[muchia[i][0]][muchia[i][1]])
        {
            if (pos1[muchia[i][0]]==1 && pos2[muchia[i][1]]==1) out<<i<<"\n";
        }else
        if (f[muchia[i][1]][muchia[i][0]]==c[muchia[i][1]][muchia[i][0]])
        {
            if (pos1[muchia[i][1]]==1 && pos2[muchia[i][0]]==1) out<<i<<"\n";
        }
    }

    in.close();
    out.close();
    return 0;
}