Cod sursa(job #1693816)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 23 aprilie 2016 22:11:50
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <cstdio>
#include <vector>
#include <queue>
#define nmax 1001
#include <cstring>
#define inf 0x3f3f3f3f
#include <algorithm>

using namespace std;

int N,M,F[nmax][nmax],cap[nmax][nmax],cd[nmax],pred[nmax],mark[nmax];
vector <int> G[nmax];
vector <int> R;
vector <pair <int,int> > T;
bool viz[nmax];

void BFS2(int s,int val,bool ok){

  cd[0] = 1;
  cd[1] = s;
  mark[s] = val;
  
  for(int i = 1;i <= cd[0];i++){
    for(vector <int> :: iterator it = G[cd[i]].begin();it != G[cd[i]].end();++it)
      if(ok == 0 && mark[*it] != val && cap[cd[i]][*it] - F[cd[i]][*it] > 0){
	  cd[++cd[0]] = *it;
	  mark[*it] = val;
	}
      else if(ok == 1 && mark[*it] != val && cap[*it][cd[i]] - F[*it][cd[i]] > 0){
	cd[++cd[0]] = *it;
	  mark[*it] = val;
      }
  }
  
}

bool BFS1(){

  memset(viz,0,sizeof(viz));
  viz[1] = 0;
  cd[0] = cd[1] = 1;

  for(int i = 1;i <= cd[0];i++){
    if(cd[i] != N){

      for(vector <int> :: iterator v = G[cd[i]].begin();v != G[cd[i]].end();++v){
	if(viz[*v] == 0 && F[cd[i]][*v] < cap[cd[i]][*v]){
	  viz[*v] = 1;
	  pred[*v] = cd[i];
	  cd[++cd[0]] = *v;
	}
      }
      
    }
  }

  return viz[N];
  
}

int main(){

  freopen("critice.in","r",stdin);
  freopen("critice.out","w",stdout);

  scanf("%d %d ",&N,&M);
  int x,y,z,i;

  for(i = 1;i <= M;i++){
    scanf("%d %d %d ",&x,&y,&z);
    G[x].push_back(y);
    G[y].push_back(x);
    cap[x][y] = cap[y][x] = z;
    T.push_back(make_pair(x,y));
  }

  int flow1 = 0,fmin;

  while(BFS1()){
    for(vector <int> :: iterator v = G[N].begin();v != G[N].end();++v){

      if(F[*v][N] >= cap[*v][N] || viz[*v] == 0)continue;

      pred[N] = *v;
      
      fmin = inf;
      for(i = N;i != 1;i = pred[i])
	fmin = min(fmin,cap[pred[i]][i] - F[pred[i]][i]);

      if(fmin == 0)continue;

      for(i = N;i != 1;i = pred[i]){
	F[pred[i]][i] += fmin;
	F[i][pred[i]] += fmin;
      }

      flow1 += fmin;
      
    }
  }

  BFS2(1,1,0);
  BFS2(N,2,1);

  for(i = 0;i < T.size();i++)
    if(mark[T[i].first] + mark[T[i].second] == 3)R.push_back(i+1);

  //for(i = 1;i <= N;i++)printf("%d %d\n",source[i],dest[i]);

  //printf("%d\n",flow1);
  printf("%d\n",R.size());
  for(vector <int> :: iterator v = R.begin();v != R.end();++v)printf("%d\n",*v);
  
  return 0;
  
}