Cod sursa(job #84961)

Utilizator gigi_becaliGigi Becali gigi_becali Data 18 septembrie 2007 21:50:22
Problema Critice Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
using namespace std;
#include <cstdio>
#include <vector>
#include <string>
#define maxn 1024
#define pb push_back
#define short int

vector<short> a[maxn];

short c[maxn][maxn];
short t[maxn];
int n, m;
short muchii[10001][2], nm;
bool sol1[maxn][maxn],sol2[maxn][maxn];

void read()
{
  freopen("critice.in","r",stdin);
  scanf("%d %d\n", &n, &m);
  int p, q, w;
  while(m--)
    {
      scanf("%d %d %d\n", &p, &q, &w);
      c[p][q]=c[q][p]=w;
      a[p].pb(q);
      a[q].pb(p);
      muchii[++nm][0]=p; 
      muchii[nm][1]=q;
    }
}

inline int bfs()
{
  short Q[maxn], p=1,q=1;
  bool use[maxn];
  memset(use, 0, sizeof(use));
  memset(t, 0, sizeof(t));
  use[1]=1;
  Q[1]=1;
  int u;
  vector<short>::iterator it;

  while(p<=q)
    {
      u=Q[p++];
      for(it=a[u].begin();it!=a[u].end();++it)
	if(c[u][*it]>0)
	  if(!use[*it])
	    {
	      use[*it]=1;
	      t[*it]=u;
	      Q[++q]=*it;
	    }
    }
  if(t[n]==0)return 0;
  return 1;
}

void maxflow()
{
  int min=0, i, ok;
  vector<short>::iterator it;
  while(bfs())
    {
      for(it=a[n].begin();it!=a[n].end();++it)
	{
	  if(t[*it]==0) continue;
	  min=c[*it][n];
	  if(min==0)continue;
	  ok=1;
	  for(i=*it;i!=1; i=t[i])if(t[i]==0 && i!=1){ok=0;break;}
	  if(ok==0)continue;
	  
	  for(i=*it;i!=1; i=t[i])min<?=c[t[i]][i];
	  if(min==0)continue;
	  for(i=*it;i!=1; i=t[i]) c[t[i]][i]-=min, c[i][t[i]]+=min;
	} 
    }


}

void bfs1()
{
  short Q[maxn], p=1, q=1;
  bool use[maxn];
  memset(use, 0, sizeof(use));
  Q[1]=1;
  int u;
  vector<short>::iterator it;

  while(p<=q)
    {
      u=Q[p++];
      for(it=a[u].begin();it!=a[u].end();++it)
	if(!use[*it])
	if(c[u][*it]==0) sol1[u][*it]=sol1[*it][u]=1;
	else if(c[u][*it]>0)
	  {
	    Q[++q]=*it;
	    use[*it]=1;
	    sol1[u][*it]=sol1[*it][u]=1;
	  }
      
    }

}

void bfs2()
{
  short Q[maxn], p=1, q=1;
  bool use[maxn];
  memset(use, 0, sizeof(use));
  Q[1]=n;
  int u;
  vector<short>::iterator it;

  while(p<=q)
    {
      u=Q[p++];
      //printf("%d\n", u);
      for(it=a[u].begin();it!=a[u].end();++it)
	if(!use[*it])
	if(c[*it][u]==0) sol2[u][*it]=sol2[*it][u]=1;
	else if(c[*it][u]>0)
	  {
	    Q[++q]=*it;
	    use[*it]=1;
	    sol2[u][*it]=sol2[*it][u]=1;
	  }
      
    }

}


int main()
{
  freopen("critice.out","w",stdout);
  read();
  maxflow();
  bfs1();
  bfs2();
  int nrsol=0;
  for(int i=1;i<=nm;++i)
    if(sol1[muchii[i][0]][muchii[i][1]] && sol2[muchii[i][0]][muchii[i][1]])
      ++nrsol;
  printf("%d\n", nrsol);
 for(int i=1;i<=nm;++i)
    if(sol1[muchii[i][0]][muchii[i][1]] && sol2[muchii[i][0]][muchii[i][1]])
      printf("%d\n", i);

  return 0;
}