Cod sursa(job #2750932)

Utilizator GligarEsterabadeyan Hadi Gligar Data 13 mai 2021 17:23:14
Problema Critice Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

const int nmax=1000, inf=(1<<30)-1, mmax=10000;

vector <int> g[nmax+1];

int f[nmax+1][nmax+1], t[nmax+1], c[mmax+1][2];

int v[nmax+1],u[nmax+1],vsol[nmax+1];

queue <int> q;

void dfs(int x, int *v){
    v[x]=1;
    for(int i=0;i<int(g[x].size());i++){
        int xn=g[x][i];
        if(v[xn]==0&&f[x][xn]>0&&f[xn][x]>0){
            dfs(xn, v);
        }
    }
}

int main(){
    int n,m;
    fin>>n>>m;
    for(int i=1;i<=m;i++){
        int x,y,z;
        fin>>x>>y>>z;
        g[x].push_back(y);
        g[y].push_back(x);
        c[i][0]=x;
        c[i][1]=y;
        f[x][y]=z;
        f[y][x]=z;
    }
    int ok=1;
    while(ok==1){
        for(int i=1;i<=n;i++){
            t[i]=0;
        }
        q.push(1);
        while(q.empty()==0){
            int x=q.front();
            q.pop();
            for(int i=0;i<int(g[x].size());i++){
                int xn=g[x][i];
                if(f[x][xn]>0&&t[xn]==0){
                    t[xn]=x;
                    q.push(xn);
                }
            }
        }
        if(t[n]!=0){
            ok=1;
            for(int i=0;i<int(g[n].size());i++){
                int p=g[n][i],mini=f[g[n][i]][n];
                if(mini>0){
                    while(p!=1){
                        if(f[t[p]][p]<mini){
                            mini=f[t[p]][p];
                        }
                        p=t[p];
                    }
                    p=g[n][i];
                    if(mini>0){
                        while(p!=1){
                            f[t[p]][p]-=mini;
                            f[p][t[p]]+=mini;
                            p=t[p];
                        }
                        f[g[n][i]][n]-=mini;
                        f[n][g[n][i]]+=mini;
                    }
                }
            }
        }else{
            ok=0;
        }
    }
    //fout<<sol<<"\n";
    dfs(1,v);
    dfs(n,u);
    int sol=0;
    for(int i=1;i<=m;i++){
        int x=c[i][0], y=c[i][1];
        if((u[x]==1&&v[y]==1)||(u[y]==1&&v[x]==1)){
            sol++;
            vsol[sol]=i;
        }
    }
    fout<<sol<<"\n";
    for(int i=1;i<=sol;i++){
        fout<<vsol[i]<<"\n";
    }
    return 0;
}