Cod sursa(job #2772801)

Utilizator Raresr14Rosca Rares Raresr14 Data 2 septembrie 2021 21:46:35
Problema Critice Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int n,i,m,T[1010],F,a[1005][1005],S[10010],nr,flux[1005][1005],flux2[1005][1005],C[1005][1005],x,y,z;
int crt_verif1,crt_verif2,verif[1005][1005],ant,crt;
pair<int,int> v[10005];
queue<int> q;
bitset<1005> f;
vector<int> L[1005];
int bfs(){
    f.reset();
    q.push(1);
    f[1]=1;
    while(!q.empty()){
        int nod=q.front();
        for(int i=0;i<L[nod].size();i++){
            int vec=L[nod][i];
            if(!f[vec]&&C[nod][vec]-flux[nod][vec]>0){
                q.push(vec);
                T[vec]=nod;
                f[vec]=1;
            }
        }
        q.pop();
    }
    return f[n];
}
void flow(){
    int sol=0;
    while(bfs()){
       for(int i=0;i<L[n].size();i++){
            int nod=L[n][i];
            if(C[nod][n]-flux[nod][n]>0&&f[nod]){
                int vec=nod;
                int minim=C[nod][n]-flux[nod][n];
                while(nod!=1){
                    minim=min(minim,C[T[nod]][nod]-flux[T[nod]][nod]);
                    nod=T[nod];
                }
                nod=vec;
                flux[nod][n]+=minim;
                flux[n][nod]-=minim;
                sol+=minim;
                while(nod!=1){
                    flux[T[nod]][nod]+=minim;
                    flux[nod][T[nod]]-=minim;
                    nod=T[nod];
                }
            }
       }
    }
}
int bfs1(){
    f.reset();
    q.push(1);
    int ok=0;
    f[1]=1;
    while(!q.empty()){
        int nod=q.front();
        for(int i=0;i<L[nod].size();i++){
            int vec=L[nod][i];
            if(!f[vec]){
                if(C[nod][vec]-flux[nod][vec]>0){
                    q.push(vec);
                }else{
                    if(!verif[nod][vec]&&!ok&&!verif[vec][nod]){
                        verif[nod][vec]=ok=verif[vec][nod]=1;
                        crt++;
                        q.push(vec);
                        crt_verif1=vec;
                        crt_verif2=nod;
                    }
                }
                f[vec]=1;
            }
        }
        q.pop();
    }
    return f[n];
}
int main(){
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>x>>y>>z;
        L[x].push_back(y);
        L[y].push_back(x);
        C[x][y]=C[y][x]=z;
        a[x][y]=a[y][x]=i;
    }
    flow();
    while(true){
        bfs1();
        if(crt==ant)
            break;
        if(f[n])
            S[++nr]=a[crt_verif2][crt_verif1];
        ant=crt;
    }
    sort(S+1,S+nr+1);
    fout<<nr<<"\n";
    for(i=1;i<=nr;i++)
        fout<<S[i]<<"\n";
    return 0;
}