Cod sursa(job #1980233)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 12 mai 2017 16:53:02
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 kb
#include<bits/stdc++.h>
using namespace std;
ifstream in("critice.in");
ofstream out("critice.out");
const int NMAX = 1005;
int N,M,c[NMAX][NMAX],f[NMAX][NMAX],viz[NMAX],pr[NMAX],ind[NMAX][NMAX],viz2[NMAX],viz1[NMAX];
vector<int> v[NMAX],sol;

void read()
{

    in>>N>>M;
    int x,y,z;
    for(int i = 1 ; i <= M ; ++i){

        in>>x>>y>>z;
        c[x][y] += z;
        c[y][x] += z;
        ind[x][y] = ind[y][x] = i;
        v[x].push_back(y);
        v[y].push_back(x);
    }
}

void reset()
{

    for(int i = 1 ;i <= N ; ++i)
        viz[i] = 0;
}

int bfs()
{

    reset();
    queue<int> Q;
    Q.push(1);
    viz[1] = 1;
    while(!Q.empty())
    {

        int virf = Q.front();
        Q.pop();
        for(int i = 0 ; i < v[virf].size() ; ++i){
            int now = v[virf][i];
            if(viz[now] || c[virf][now] == f[virf][now])
                continue;
            pr[now] = virf;
            viz[now] = 1;
            Q.push(now);
        }
    }
    return viz[N];
}

void max_flow()
{

    while(bfs()){

        for(int i = 0 ; i < v[N].size() ; ++i){
            if(!viz[v[N][i]] || c[v[N][i]][N] == f[v[N][i]][N])
                continue;
            pr[N] = v[N][i];
            int minim = 1 << 30;
            for(int act = N ; act != 1 ; act = pr[act])
                minim = min(minim,c[pr[act]][act] - f[pr[act]][act]);
            for(int act = N ; act != 1 ; act = pr[act]){
                c[pr[act]][act] += minim;
                c[act][pr[act]] -= minim;
            }
        }
    }
}

void bfs2(int nod,int viz[])
{

    queue<int> Q;
    Q.push(nod);
    viz[nod] = 1;
    while(!Q.empty()){

        int virf = Q.front();
        Q.pop();
        for(int i = 0 ; i < v[virf].size() ; ++i){
            int now = v[virf][i];
            if(viz[now] || c[virf][now] == f[virf][now])
                continue;
            viz[now] = 1;
            Q.push(now);
        }
    }
}

void solve()
{

    bfs2(1,viz1);
    bfs2(N,viz2);
    for(int i = 1 ; i <= N ; ++i)
        for(int j = 0 ; j < v[i].size() ; ++j)
            if(c[i][v[i][j]] == f[i][v[i][j]])
                if((viz1[i] && viz2[v[i][j]]) || (viz2[i] && viz1[v[i][j]]))
                    sol.push_back(ind[i][v[i][j]]);
    sort(sol.begin(),sol.end());
    out<<sol.size()<<"\n";
    for(int i = 0 ;i < sol.size() ;++i)
        out<<sol[i]<<"\n";
    out.close();
}

int main()
{

    read();
    max_flow();
    solve();
    return 0;
}