Cod sursa(job #3146594)

Utilizator Luca529Taschina Luca Luca529 Data 21 august 2023 19:43:36
Problema Critice Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int n, x[1001][1001], y[1001][1001], p[1001], p1[10001];
vector<int> v[1001];

int BFS()
{for(int i=1;i<=n;i++)
 p[i]=0;
 queue<int> q;
 int a;

 p[1]=1;
 q.push(1);
 while(q.empty()!=1)
 {a=q.front();
  vector<int>:: iterator I;

  for(I=v[a].begin();I<v[a].end();I++)
  if(p[*I]==0 && x[a][*I]>0)
  {p[*I]=p[a]+1;
   q.push(*I);
  }
  q.pop();
 }
 return p[n]!=0;
}

int DFS(int nod, int mini)
{if(nod==n)return mini;

 vector<int>:: iterator I;
 for(I=v[nod].begin();I<v[nod].end();I++)
 if(x[nod][*I]>0 && p[nod]+1==p[*I])
 {int a=DFS(*I, min(mini, x[nod][*I]));
  if(a>0)
  {x[nod][*I]-=a;
   x[*I][nod]+=a;
   return a;
  }
 }
 return 0;
}

void DFS1(int nod)
{p[nod]=1;
 vector<int>:: iterator I;
 for(I=v[nod].begin();I<v[nod].end();I++)
 if(p[*I]==0)
 {if(x[nod][*I]==0)p1[y[nod][*I]]++;
  else DFS1(*I);
 }
}

void DFS2(int nod)
{p[nod]=1;
 vector<int>:: iterator I;
 for(I=v[nod].begin();I<v[nod].end();I++)
 if(p[*I]==0)
 {if(x[*I][nod]==0)p1[y[*I][nod]]++;
  else DFS2(*I);
 }
}

int main()
{   int m, a, b, c, k=0;
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {fin>>a>>b>>c;
     v[a].push_back(b);
     v[b].push_back(a);

     x[a][b]=c;
     y[a][b]=y[b][a]=i;
    }

    while(BFS())
    DFS(1, 1e9);

    fill(p+1, p+1+n, 0);
    DFS1(1);
    fill(p+1, p+1+n, 0);
    DFS2(n);

    for(int i=1;i<=m;i++)
    if(p1[i]==2)k++;

    fout<<k<<"\n";
    for(int i=1;i<=m;i++)
    if(p1[i]==2)fout<<i<<"\n";
    return 0;
}