Cod sursa(job #3536)

Utilizator blasterzMircea Dima blasterz Data 26 decembrie 2006 19:41:28
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.89 kb
#include <cstdio>
#include <string>
#define maxn 1024
#define maxm 10005

int c[maxn][maxn], f[maxn][maxn], a[maxn][maxn], nr[maxn][maxn];
int critice[maxn][maxn], oki[maxn][maxn];
int n, m;
int muchii[maxm][3], sol[maxm];

void citire()
{
  freopen("critice.in", "r", stdin);
  scanf("%d %d\n", &n, &m);
  for(int i=1;i<=m;i++)
    {
      int p, q, w;
      scanf("%d %d %d\n", &p, &q, &w);
      c[p][q]=c[q][p]=w;
      nr[p][q]=nr[q][p]=i;
      a[p][++a[p][0]]=q;
      a[q][++a[q][0]]=p;
      muchii[i][1]=p;
      muchii[i][2]=q;
    }
}
int min(int a, int b)
{
  if(a<b) return a;
  return b;
}


int bfs()
{
  int Q[maxn], viz[maxn],pred[maxn], p=1, q=1, u, i;
  memset(viz, 0, sizeof(viz));
  memset(pred, -1, sizeof(pred));
  Q[1]=1;
  viz[1]=1;
  
  while(p<=q)
    {
      u=Q[p++];

      for(i=1;i<=a[u][0];i++)
	if(!viz[a[u][i]])
	  if(c[u][a[u][i]]>f[u][a[u][i]])
	    {
	      pred[a[u][i]]=u;
	      viz[a[u][i]]=1;
	      Q[++q]=a[u][i];
	      if(a[u][i]==n) goto exit_loop;
	    }
    }
 exit_loop:
  if(pred[n]==-1) return 0;
  
  int flow=0x3f3f3f3f;
  
  for(i=n ; pred[i]!=-1; i=pred[i])flow=min(flow, c[pred[i]][i]-f[pred[i]][i]);

  for(i=n; pred[i]!=-1; i=pred[i]) 
    {
      f[pred[i]][i]+=flow;
      f[i][pred[i]]-=flow;
    }
  return flow;
}

int max_flow()
{
  int flow=0, p;

  while(1)
    {
      p=bfs();
      if(!p) break;
      flow+=p;
    }
  return flow;
}

void bfs2(int s, int d)
{
  int Q[maxn], viz[maxn], pred[maxn], p=1, q=1, u, i;
  memset(viz, 0,sizeof(viz));
  memset(pred, -1, sizeof(pred));
  Q[1]=s;
  viz[s]=1;

  while(p<=q)
    {
      u=Q[p++];

      for(i=1;i<=a[u][0];i++)
	if(!viz[a[u][i]])
	  if(c[u][a[u][i]]>=f[u][a[u][i]])
	    {
	      if(pred[u]==-1) 
		{
		  if(c[u][a[u][i]]==f[u][a[u][i]]);
		  else critice[u][a[u][i]]++;
		}
	      else if(c[pred[u]][u]>f[pred[u]][u]) critice[u][a[u][i]]++;
	      viz[a[u][i]]=1;
	      Q[++q]=a[u][i];
	    }
    }

}

int verifica( int x, int y)
{
  c[x][y]++;
  c[y][x]++;
   int Q[maxn], viz[maxn],pred[maxn], p=1, q=1, u, i;
  memset(viz, 0, sizeof(viz));
  memset(pred, -1, sizeof(pred));
  Q[1]=1;
  viz[1]=1;
  
  while(p<=q)
    {
      u=Q[p++];

      for(i=1;i<=a[u][0];i++)
	if(!viz[a[u][i]])
	  if(c[u][a[u][i]]>f[u][a[u][i]])
	    {
	      pred[a[u][i]]=u;
	      viz[a[u][i]]=1;
	      Q[++q]=a[u][i];
	      if(a[u][i]==n) goto exit_loop;
	    }
    }
 exit_loop:
  
  
  c[x][y]--;
  c[y][x]--;  
if(pred[n]==-1) return 0;
  return 1;
}


int main()
{
  citire();
  max_flow();
  int i, j;
  for(i=1;i<=m;i++)
    {
      if(verifica( muchii[i][1],muchii[i][2])) sol[i]=1;
    }
  freopen("critice.out", "w", stdout);

  int nr=0;
  for(i=1;i<=m;i++) if(sol[i]) nr++;
  printf("%d\n",nr); 
 for(i=1;i<=m;i++) if(sol[i]) printf("%d\n", i);
  
  return 0;
}