Cod sursa(job #602331)

Utilizator Smaug-Andrei C. Smaug- Data 10 iulie 2011 20:22:01
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <cstdio>
#include <vector>
using namespace std;

#define MAXN 1005
#define MAXM 10005

int C[MAXN][MAXN], F[MAXN][MAXN], I[MAXN][MAXN], T[MAXN], use[MAXN], q, Q[MAXN];
int fd[MAXM], fu[MAXM], N, M;
vector<int> G[MAXN];

int bfs_flow(){

  memset(use, 0, sizeof(use));

  int i, n;
  vector<int>::iterator ii;

  q=1; Q[1]=1; use[1]=1;

  for(i=1; i<=q; i++){
    n=Q[i];
    if(n == N)
      continue;

    for(ii=G[n].begin(); ii!=G[n].end(); ii++)
      if(C[n][*ii]!=F[n][*ii] && !use[*ii]){
	use[*ii]=1;
	Q[++q]=*ii;
	T[*ii]=n;
      }
  }

  return use[N];

}

void bfs_node(int n, int *v){

  memset(use, 0, sizeof(use));

  q=1; Q[1]=n; use[n]=1;

  int i, c;
  vector<int>::iterator ii;
  for(i=1; i<=q; i++){
    c=Q[i];
    
    for(ii=G[c].begin(); ii!=G[c].end(); ii++){
      if(C[c][*ii]==F[c][*ii] || C[*ii][c]==F[*ii][c])
	v[I[c][*ii]]=1;
      else if(!use[*ii]){
	use[*ii]=1;
	Q[++q]=*ii;
      }
    }
  }

} 

int main(){

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

  int i, a, b, c, minf;
  int R[MAXN], r;
  vector<int>::iterator ii;

  scanf("%d%d", &N, &M);
  for(i=1; i<=M; i++){
    scanf("%d%d%d", &a, &b, &c);
    G[a].push_back(b);
    G[b].push_back(a);
    C[a][b]+=c;
    C[b][a]+=c;
    I[a][b]=I[b][a]=i;
  }

  while(bfs_flow())
    for(ii=G[N].begin(); ii!=G[N].end(); ii++)
      if(use[*ii] && C[*ii][N]!=F[*ii][N]){
	T[N]=*ii;

	minf=1<<30;
	for(i=N; i!=1; i=T[i])
	  if(C[T[i]][i]-F[T[i]][i] < minf)
	    minf=C[T[i]][i]-F[T[i]][i];

	if(minf)
	  for(i=N; i!=1; i=T[i]){
	    F[T[i]][i]+=minf;
	    F[i][T[i]]-=minf;
	  }
      }

  bfs_node(1, fd);
  bfs_node(N, fu);

  r=0;
  for(i=1; i<=M; i++)
    if(fd[i] && fu[i])
      R[++r]=i;

  printf("%d\n", r);
  for(i=1; i<=r; i++)
    printf("%d\n", R[i]);
  
  return 0;

}