Cod sursa(job #1829536)

Utilizator akaprosAna Kapros akapros Data 15 decembrie 2016 10:04:47
Problema Critice Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <bits/stdc++.h>
#define Nmax 1001
#define inf 0x7fffffff
using namespace std;
FILE *fin = freopen("critice.in", "r", stdin);
FILE *fout = freopen("critice.out", "w", stdout);

int n, m;
int S, D, ans[Nmax * Nmax];
int r[Nmax][Nmax], mat[Nmax][Nmax];
int deUnde[Nmax];
bool vis[2][Nmax];
queue < int > Q;

void read()
{
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= m; ++ i)
    {
        int x, y, z;
        scanf("%d %d %d", &x, &y, &z);
        r[x][y] = z;
        mat[x][y] = mat[y][x] = i;
    }
    S = 1;
    D = n;
}

void BFS(int S, int D)
{
    int i;
    memset(deUnde, 0, sizeof(deUnde));
    Q.push(S);
    deUnde[S] = S;
    deUnde[D] = D;
    while (!Q.empty())
    {
        int x = Q.front();
        Q.pop();
        for (i = 1; i < n; ++ i)
            if (r[x][i] > 0 && deUnde[i] == 0)
            {
                deUnde[i] = x;
                Q.push(i);
            }
    }
}
void dfs(int x, bool y)
{
    for (int i = 1; i <= n; ++ i)
        if ((y == 0 && r[x][i] > 0 && !vis[y][i]) || (y == 1 && r[i][x] > 0 && !vis[y][i]))
        {
            vis[y][i] = 1;
            dfs(i, y);
        }
}

void solve()
{
    //ans = 0;
    bool continua = true;
    while (continua)
    {
        BFS(S, D);
        continua = false;
        for(int u = 1; u < n; u++)
            if (r[u][D] > 0 && deUnde[u] != 0)
            {
                continua = true;
                deUnde[D] = u;
                int nod = D, cap = inf;
                while (nod != S)
                {
                    cap = min(cap, r[deUnde[nod]][nod]);
                    nod = deUnde[nod];
                }
                nod = D;
                //ans += cap;
                while (nod != S)
                {
                    r[deUnde[nod]][nod] -= cap;
                    r[nod][deUnde[nod]] += cap;
                    nod = deUnde[nod];
                }
            }
    }
}

void write()
{
    vis[0][1] = 1;
    dfs(1, 0);
    vis[1][n] = 1;
    dfs(n, 1);
    for (int i = 1; i < n; ++ i)
        for (int j = 1; j <= n; ++ j)
            if (!r[i][j] && mat[i][j] && ((vis[0][i] && vis[1][j])))
                ans[++ ans[0]] = mat[i][j];
    printf("%d\n", ans[0]);
    for (int i = 1; i <= ans[0]; ++ i)
        printf("%d\n", ans[i]);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}