Cod sursa(job #2694892)

Utilizator MarCelDragMacel Dragan MarCelDrag Data 11 ianuarie 2021 00:05:56
Problema Critice Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <fstream>
#include <iostream>
#include <queue>
using namespace std;
int c[1001][1001], f[1001][1001];
int viz[1001],T[1001],lista[10001];
int n,m,lung,minim;
ifstream fin("critice.in");
ofstream fout("critice.out");
struct arc{int n1,n2;};
arc drum[1001],lm[10001];
int bf(){
 int i,j;
 queue <int> q;
 fill(viz,viz+1001,0);fill(T,T+1001,0);
 q.push(1);
 viz[1] = 1;
 while (q.empty() != 1){
    i = q.front();
    if (i == n)return 1;
    q.pop();
    for (j = 1;j<=n;j++){
        if (viz[j] == 0 && c[i][j] - f[i][j] > 0){//arc parcurs in sens direct
            viz[j] = 1;
            T[j] = i;
            q.push(j);}
        if (viz[j] == 0 && f[j][i] > 0){//arc parcurs in sens invers
            viz[j] = 1;
            T[j] = i;
            q.push(j);}}}
 return 0;
}
void calcdrum(){
 int i=0,b=n,a;
 minim = 10000000;
 a = T[b];
 while (a!=0){
    drum[i].n1 = a;
    drum[i].n2 = b;
    if (c[a][b] > f[a][b]){
        if (minim > c[a][b] - f[a][b])
            minim = c[a][b] - f[a][b];}
        else
            if (minim > f[b][a])
                minim = f[b][a];
    i++;
    b = a;
    a = T[b];}
 lung = i;
}
int main(){
 int ok=1;
 fin >> n >> m;
 for (int i=0;i<m;i++){
    fin >> lm[i].n1 >> lm[i].n2;
    fin >> c[lm[i].n1][lm[i].n2];
    c[lm[i].n2][lm[i].n1]=c[lm[i].n1][lm[i].n2];}
 while (ok == 1){
    ok=bf(); //returneaza 1 daca gaseste un drum
    if (ok == 1){
        calcdrum(); //calculeaza si minimul
        for (int k=0;k<lung;k++){
            int i = drum[k].n1;
            int j = drum[k].n2;
            if (c[i][j] - f[i][j] > 0)
                f[i][j] += minim;
            else
                f[j][i] -= minim;}}}
 int lLista=0;
 for(int i=0;i<m;i++){
    c[lm[i].n2][lm[i].n1]++;
    c[lm[i].n1][lm[i].n2]++;
     ok=bf(); //returneaza 1 daca gaseste un drum
     if (ok == 1){
         calcdrum(); //calculeaza si minimul
         if(minim>0)
            lista[lLista++]=i+1;}

    c[lm[i].n2][lm[i].n1]--;
    c[lm[i].n1][lm[i].n2]--;}
    fout<<lLista<<endl;
 for(int i=0;i<lLista;i++)
        fout<<lista[i]<<endl;
 return 0;}