Cod sursa(job #1069293)

Utilizator Athena99Anghel Anca Athena99 Data 29 decembrie 2013 19:04:32
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

ifstream fin("critice.in");
ofstream fout("critice.out");

const int inf= 1<<30;
const int nmax= 1000;
const int mmax= 10000;

int n, m;
vector <int> v[nmax+1];
int c[nmax+1][nmax+1], f[nmax+1][nmax+1], p[nmax+1], sol[mmax+1];
bool u[nmax+1];

struct edge {
    int x, y;
} a[mmax+1];

int bfs(  ) {
    for ( int i= 0; i<=nmax; ++i ) {
        u[i]= 0;
    }
    u[1]= 1;

    queue <int> q;
    q.push(1);
    while ( !q.empty() ) {
        int x= q.front();
        q.pop();
        if ( x<n ) {
            for ( int i= 0; i<(int)v[x].size(); ++i ) {
                int y= v[x][i];
                if ( f[x][y]!=c[x][y] && u[y]==0 ) {
                    u[y]= 1;
                    q.push(y);
                    p[y]= x;
                }
            }
        }
    }

    return u[n];
}

int maxflow(  ) {
    int flow= 0;
    while ( bfs() ) {
        for ( int i= 0; i<(int)v[n].size(); ++i ) {
            int x= v[n][i];
            if ( f[x][n]!=c[x][n] && u[x]==1 ) {
                p[n]= x;

                int fmin= inf;
                for ( x= n; x!= 1; x= p[x] ) {
                    if ( c[p[x]][x]-f[p[x]][x]<fmin ) {
                        fmin= c[p[x]][x]-f[p[x]][x];
                    }
                }
                for ( x= n; x!= 1; x= p[x] ) {
                    f[p[x]][x]+= fmin;
                    f[x][p[x]]-= fmin;
                }

                flow+= fmin;
            }
        }
    }

    return flow;
}

int main(  ) {
    fin>>n>>m;
    for ( int i= 1; i<=m; ++i ) {
        int x, y, z;
        fin>>x>>y>>z;
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y]= c[y][x]= z;
        a[i].x= x, a[i].y= y;
    }

    int firstflow= maxflow();
    for ( int i= 1; i<=m; ++i ) {
        for ( int j= 1; j<=n; ++j ) {
            for ( int k= 1; k<=n; ++k ) {
                f[j][k]= 0;
            }
        }

        ++c[a[i].x][a[i].y], ++c[a[i].y][a[i].x];
        
        if ( maxflow()>firstflow ) {
            ++sol[0];
            sol[sol[0]]= i;
        }

        --c[a[i].x][a[i].y], --c[a[i].y][a[i].x];
    }

    for ( int i= 0; i<=sol[0]; ++i ) {
        fout<<sol[i]<<"\n";
    }

    return 0;
}