Cod sursa(job #2772812)

Utilizator Raresr14Rosca Rares Raresr14 Data 2 septembrie 2021 22:18:03
Problema Critice Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.64 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,f1;
vector<int> L[1005];
int bfs(){
    f.reset();
    q.push(1);
    while(!q.empty()){
        int nod=q.front();
        f[nod]=1;
        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;
            }
        }
        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];
                }
            }
       }
    }
}
void bfs1(){
    f[1]=1;
    q.push(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){
                f[vec]=1;
                q.push(vec);
            }
        }
        q.pop();
    }
}
void bfs2(){
    f1[n]=1;
    q.push(n);
    while(!q.empty()){
        int nod=q.front();
        for(int i=0;i<L[nod].size();i++){
            int vec=L[nod][i];
            if(!f1[vec]&&C[vec][nod]-flux[vec][nod]>0){
                f1[vec]=1;
                q.push(vec);
            }
        }
        q.pop();
    }
}
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;
        v[i].first=x,v[i].second=y;
    }
    flow();
    f.reset();
    bfs1();
    bfs2();
    for(i=1;i<=m;i++){
        x=v[i].first,y=v[i].second;
        if((f[x]&&f1[y])||(f[y]&&f1[x]))
            if((C[x][y]-flux[x][y]==0)||(C[y][x]-flux[y][x]==0))
                S[++nr]=i;
    }
    fout<<nr<<"\n";
    for(i=1;i<=nr;i++)
        fout<<S[i]<<"\n";
    return 0;
}