Cod sursa(job #2663180)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 25 octombrie 2020 15:34:50
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda trainingflow Marime 2.3 kb
#include <fstream>
#include <bitset>
#include <deque>
#include <vector>
#define rmax 1000000
using namespace std;

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

int n,m,i,j,k,c[1001][1001],flux[1001][1001],t[1001],nod,vec,v[2][1001],cnt,sol[10001];
vector <int> l[1001];
deque <int> q;
bitset <1001> f;
pair <int,int> edg[10001];

bool bfs(){
    f.reset();
    f[1]=1;
    q.push_back(1);

    while(!q.empty()){
        nod=q.front();
        q.pop_front();

        for(int i=0;i<l[nod].size();i++){
            vec=l[nod][i];

            if(!f[vec] && c[nod][vec]>flux[nod][vec]){
                f[vec]=1;
                q.push_back(vec);
                t[vec]=nod;
            }
        }
    }

    return f[n];
}

void bfs2(int nod, int x){

    f.reset();
    f[nod]=1;
    q.push_back(nod);
    v[x][nod]=1;

    while(!q.empty()){
        nod=q.front();
        q.pop_front();

        for(int i=0;i<l[nod].size();i++){
            vec=l[nod][i];

            if(!f[vec] && c[nod][vec]>max(flux[nod][vec],-flux[nod][vec])){
                f[vec]=1;
                q.push_back(vec);
                v[x][vec]=1;
            }
        }
    }

}

int main(){
    fin>>n>>m;

    for(k=1;k<=m;k++){
        fin>>i>>j;
        fin>>c[i][j];
        c[j][i]=c[i][j];
        l[i].push_back(j);
        l[j].push_back(i);

        edg[k]={i,j};
    }

    while(bfs()){

        for(i=0;i<l[n].size();i++){
            nod=l[n][i];

            if(!f[nod] || c[nod][n]==flux[nod][n])
                continue;

            k=c[nod][n]-flux[nod][n];

            while(nod!=1){
                k=min(k,c[t[nod]][nod]-flux[t[nod]][nod]);
                nod=t[nod];
            }

            nod=l[n][i];
            flux[nod][n]+=k;
            flux[n][nod]-=k;

            while(nod!=1){
                flux[t[nod]][nod]+=k;
                flux[nod][t[nod]]-=k;
                nod=t[nod];
            }
        }
    }

    bfs2(1,0);
    bfs2(n,1);

    for(k=1;k<=m;k++){
        i=edg[k].first;
        j=edg[k].second;

        if( (v[0][i] && v[1][j]) || (v[1][i] && v[0][j]) )
            sol[++cnt]=k;
    }

    fout<<cnt<<"\n";
    for(i=1;i<=cnt;i++)
        fout<<sol[i]<<"\n";

    return 0;
}