Cod sursa(job #841424)

Utilizator stoicatheoFlirk Navok stoicatheo Data 24 decembrie 2012 10:42:10
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb

#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

#define MAX_N 1005
#define MAX_M 10005
#define INF 0x3f3f3f3f

#define foreach(V) for(typeof (V).begin() it = (V).begin(); it != (V).end(); ++it)
#define nr first
#define ord second

int N, M;
int F[MAX_N][MAX_N], C[MAX_N][MAX_N], T[MAX_N];
vector <pair <int, int> > G[MAX_N];
bool viz[MAX_N], V[MAX_M];
int Ans[MAX_M];

void citire()
{
    scanf("%d %d",&N, &M);

    for(int i = 1; i <= M; ++i)
    {
        int x, y, c;
        scanf("%d %d %d",&x, &y, &c);

        C[x][y] = C[y][x] = c;
        G[x].push_back(make_pair(y, i));
        G[y].push_back(make_pair(x, i));
    }
}

bool BF()
{
    memset(viz, 0, sizeof viz);

    int Q[MAX_N];
    Q[0] = Q[1] = 1;
    viz[1] = 1;

    for(int i = 1; i <= Q[0]; ++i)
    {
        int nod = Q[i];
        if(nod == N) continue;

        foreach(G[nod])
        {
            int act = it -> nr;
            if(viz[act] || F[nod][act] == C[nod][act]) continue;

            Q[++Q[0]] = act;
            viz[act] = true;
            T[act] = nod;
        }
    }
    return viz[N];
}

void flux()
{
    for(int fmin = INF; BF();)
        foreach(G[N])
        {
            int nod = it -> nr;
            if(!viz[nod] || C[nod][N] == F[nod][N]) continue;

            fmin = INF;
            T[N] = nod;

            for(int i = N; i != 1; i = T[i])
                fmin = min(fmin, C[T[i]][i] - F[T[i]][i]);

            for(int i = N; i != 1; i = T[i])
                F[T[i]][i] += fmin,
                F[i][T[i]] -= fmin;
        }
}

void search(int nod)
{
    int Q[MAX_N];
    Q[0] = 1;
    Q[1] = nod;
    memset(viz, 0, sizeof viz);
    viz[nod] = 1;

    for(int i = 1; i <= Q[0]; ++i)
    {
        int nod = Q[i];

        foreach(G[nod])
        {
            int act = it -> nr;
            int ord = it -> ord;

            if(viz[act]) continue;

            if(F[nod][act] == C[nod][act] || (V[ord] && F[act][nod] == C[act][nod]))
                if(V[ord])
                    Ans[++Ans[0]] = ord;
                else
                    V[ord] = true;
            else
                viz[act] = true,
                Q[++Q[0]] = act;
        }
    }
}

void afisare()
{
    printf("%d\n",Ans[0]);

    sort(Ans+1, Ans+Ans[0]+1);

    for(int i = 1; i <= Ans[0]; ++i)
        printf("%d\n",Ans[i]);
}

int main()
{
    freopen("critice.in","rt",stdin);
    freopen("critice.out","wt",stdout);

    citire();
    flux();
    search(1);
    search(N);
    afisare();
}