Cod sursa(job #1693781)

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

using namespace std;

struct tripl{
  int x,y,nr;
};

inline tripl make_tripl(int x,int y,int i){
  tripl aux;
  aux.x = x;
  aux.y = y;
  aux.nr = i;

  return aux;
}

int N,M,cap[nmax][nmax],F[nmax][nmax],cd[nmax],pred[nmax];
vector <tripl> T;
vector <int> R;
bool viz[nmax],source[nmax],dest[nmax];

bool BFS1(){

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

  for(int i = 1;i <= cd[0];i++){
    if(cd[i] == N)continue;
    for(vector <tripl> :: iterator v = T.begin();v != T.end();++v){
      if(v->x != cd[i] || F[cd[i]][v->y] == cap[cd[i]][v->y] || viz[v->y] == 1)continue;
      viz[v->y] = 1;
      pred[v->y] = cd[i];
      cd[++cd[0]] = v->y;
    }
  }

  return viz[N];
  
}

void BFS2(int s,bool ok,bool vec[]){

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

  for(int i = 1;i <= cd[0];i++){
    for(vector <tripl> :: iterator it = T.begin();it != T.end();++it){
      if(it->x != cd[i] || viz[it->y] == 1)continue;
      if(F[cd[i]][it->y] == cap[cd[i]][it->y]){
	vec[cd[i]] = 1;
	if(ok == 1 && source[it->y] == 1)R.push_back(it->nr);
      }
      else{
	viz[it->y] = 1;
	cd[++cd[0]] = it->y;
      }
    }
  }
  
}

int main(){

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

  scanf("%d %d ",&N,&M);
  int i,z,fmin = inf,x,y;
  tripl aux_vec;
  for(i = 1;i <= M;i++){
    scanf("%d %d %d ",&x,&y,&z);
    cap[x][y] = cap[y][x] = z;
    T.push_back(make_tripl(x,y,i));
    T.push_back(make_tripl(y,x,i));
  }

  int flow = 0;

  while(BFS1()){
    for(vector <tripl> :: iterator v = T.begin();v != T.end();++v){
      if(v->x == N && F[v->y][N] < cap[v->y][N] && viz[v->y] == 1){
      pred[N] = v->y;
      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;
      }
      flow += fmin;
     }
      
    }
    }

  BFS2(1,0,source);
  BFS2(N,1,dest);

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