Cod sursa(job #1208181)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 14 iulie 2014 22:56:10
Problema Critice Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

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

vector <int> l[1010];
int t[1010],F[1010],fn[1010],f[1010][1010],c[1010][1010],r[10010],q[1010];
int n,m,i,C,j,k,p,u,minim,x,y;

struct data {
    int x;
    int y;
}v[10010];

int bfs() {

    memset(t,0,sizeof(t));
    memset(F,0,sizeof(F));
    t[1]=-1;
    F[1]=1;
    p=u=q[1]=1;

    while (p<=u) {
        x=q[p];
        for (int i=0;i<l[x].size();i++) {
            y=l[x][i];
            if (t[y]==0 && c[x][y]>f[x][y]) {
                q[++u]=y;
                t[y]=x;
                F[y]=1;
            }
        }
        p++;
    }
    return t[n];
}

int bfs1() {

    memset(t,0,sizeof(t));
    fn[n]=1;
    t[n]=-1;
    p=u=1;
    q[1]=n;

    while (p<=u) {
        x=q[p];
        for (int i=0;i<l[x].size();i++) {
            y=l[x][i];
            if (t[y]==0 && c[x][y]<f[x][y]) {
                q[++u]=y;
                t[y]=x;
                fn[y]=1;
            }
        }
        p++;
    }
    return t[n];
}

int main () {

    fin>>n>>m;
    for (i=1;i<=m;i++) {
        fin>>v[i].x>>v[i].y>>C;
        l[v[i].x].push_back(v[i].y);
        l[v[i].y].push_back(v[i].x);
        c[v[i].x][v[i].y]=C;
        c[v[i].y][v[i].x]=-C;
    }

    while (bfs()) {

        for (i=0;i<l[n].size();i++) {
            x=l[n][i];
            if (t[x]!=0 && c[x][n]>f[x][n]){
                minim=c[x][n]-f[x][n];
                while (t[x]!=-1){
                    if (minim>c[t[x]][x]-f[t[x]][x])
                        minim=c[t[x]][x]-f[t[x]][x];
                    x=t[x];
                }
                x=l[n][i];
                f[x][n]+=minim;
                f[n][x]-=minim;
                while (t[x]!=-1){
                    f[t[x]][x]+=minim;
                    f[x][t[x]]-=minim;
                    x=t[x];
                }
            }
        }
    }

    bfs();

    bfs1();

    for (i=1;i<=m;i++)
        if ((F[v[i].x]&&fn[v[i].y])||(fn[v[i].x]&&F[v[i].y]))
            r[++k]=i;
    fout<<k<<"\n";
    for (i=1;i<=k;i++)
        fout<<r[i]<<"\n";

    return 0;
}