Cod sursa(job #1242380)

Utilizator geniucosOncescu Costin geniucos Data 14 octombrie 2014 13:19:03
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.1 kb
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
int m, a[10009], b[10009], c[10009];
class graph
{
    public:
    int flux, N, S, D, f[1009][1009], c[1009][1009], t[1009], ap[2][1009];
    vector < int > muchii[1009], v[2][1009];

    void Add_edge (int i, int j, int cost)
    {
        muchii[i].push_back(j);
        muchii[j].push_back(i);
        c[i][j] = c[j][i] = cost;
    }

    bool bfs()
    {
        queue < int > q;
        for (int i=1; i<=N; i++)
            t[i] = -1;
        q.push(S);
        t[S] = 0;
        while (!q.empty())
        {
            int nod = q.front();
            q.pop();
            for (vector < int > :: iterator it = muchii[nod].begin(); it != muchii[nod].end(); it++)
                if (t[*it] == -1 && f[nod][*it] < c[nod][*it])
                {
                    t[*it] = nod;
                    if (*it == D) return 1;
                    q.push(*it);
                }
        }
        return 0;
    }

    void calc_flux()
    {
        flux = 0;
        while ( bfs() )
        {
            for (vector < int > :: iterator it = muchii[D].begin(); it != muchii[D].end(); it++)
                if (t[*it] != -1 && f[*it][D] < c[*it][D])
                {
                    int nod = *it, fmin = 100000;
                    t[D] = nod;
                    for (int i = D; i != S; i = t[i])
                        if (c[t[i]][i] - f[t[i]][i] < fmin)
                            fmin = c[t[i]][i] - f[t[i]][i];
                    flux += fmin;
                    for (int i = D; i != S; i = t[i])
                    {
                        f[t[i]][i] += fmin;
                        f[i][t[i]] -= fmin;
                    }
                }
        }
    }

    void dfs (int nod, int lin)
    {
        ap[lin][nod] = 1;
        for (vector < int > :: iterator it = v[lin][nod].begin(); it != v[lin][nod].end(); it ++)
            if (ap[lin][*it] == 0) dfs (*it, lin);
    }

    void calc_ap01 ()
    {
        for (int i=1; i<=N; i++)
        {
            ap[0][i] = ap[1][i] = 0;
            for (vector < int > :: iterator it = muchii[i].begin(); it != muchii[i].end(); it++)
                if (f[i][*it] < c[i][*it])
                {
                    v[0][i].push_back(*it);
                    v[1][*it].push_back(i);
                }
        }
        dfs (S, 0);
        dfs (D, 1);
    }

}graf;
void build_graph()
{
    scanf ("%d", &graf.N);
    scanf ("%d", &m);
    graf.S = 1;
    graf.D = graf.N;
    for (int i=1; i<=m; i++)
    {
        scanf ("%d %d %d", &a[i], &b[i], &c[i]);
        graf.Add_edge (a[i], b[i], c[i]);
    }
}
int main()
{
freopen ("critice.in", "r", stdin);
freopen ("critice.out", "w", stdout);

build_graph();

graf.calc_flux();
graf.calc_ap01();
vector < int > ans;
for (int i=1; i<=m; i++)
    if ( ( graf.ap[0][a[i]] && graf.ap[1][b[i]] ) || ( graf.ap[1][a[i]] && graf.ap[0][b[i]] ) )
        ans.push_back(i);

printf ("%d\n", ans.size());
for (int i=0; i<ans.size(); i++)
    printf ("%d\n", ans[i]);

return 0;
}