Cod sursa(job #425889)

Utilizator mihaionlyMihai Jiplea mihaionly Data 26 martie 2010 11:14:39
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <cstdio>
#include <string>
#include <vector>
using namespace std;
FILE *fin=fopen("critice.in","r");
FILE *fout=fopen("critice.out","w");
#define nmax 1005
#define mmax 10002
#define inf 1<<18
struct muchie
 {
 int x,y;
 };
muchie M[mmax];
int C[nmax][nmax],Fx[nmax][nmax];
int sol[mmax],nr;
int pre[nmax];
int Q[nmax*5],k;
int f[nmax];
int s[nmax];
int n,m;
#define Q (Q-1)
bool viz[nmax];/*
struct graf
 {
 int x;
 graf *urm;
 };
graf *G[nmax];*/
vector<int> G[nmax];
inline int min(int x,int y)
 {
 if(x<y) return x;
 return y;
 }
void read()
 {
 fscanf(fin,"%d %d",&n,&m);
 int i,x,y,c;
 for(i=1;i<=m;i++)
  {
  fscanf(fin,"%d %d %d",&x,&y,&c);
  M[i].x=x;
  M[i].y=y;
  C[x][y]=c;
  C[y][x]=c;
  G[x].push_back(y);
  G[y].push_back(x);
  //add(G[x],y);
  //add(G[y],x);
  }
 }
bool bfs()
 {
 k=0;
 Q[++k]=1;
 int i,x,y,j;
 bool ok=false;
 for(i=1;i<=n;i++) {pre[i]=-1;viz[i]=false;}
 viz[1]=true;
 for(i=1;i<=k&&!ok;i++)
  {
  x=Q[i];
  for(j=0;j<G[x].size()&&!ok;j++)
   {
   y=G[x][j];
   if(!viz[y]&&C[x][y]-Fx[x][y]>0)
    {
    f[y]=min(f[x],C[x][y]-Fx[x][y]);
    pre[y]=x;
	viz[y]=true;
	Q[++k]=y;
	if(y==n)
	 ok=true;
    }
   }
  }
 return viz[n];
 }
void bfs(int nod,int z)
 {
 k=0;
 memset(viz,false,sizeof(viz));
 Q[++k]=nod;
 viz[nod]=true;
 int i,x,j,y;
 for(i=1;i<=k;i++)
  {
  x=Q[i];
  s[x]=z;
  for(j=0;j<G[x].size();j++)
   {
   y=G[x][j];
   if(!viz[y]&&((z==1)?(C[x][y]-Fx[x][y]>0):(C[y][x]-Fx[y][x]>0)))
    {
    viz[y]=true;
    Q[++k]=y;
    }
   }
  }
 }
void solve()
 {
 bfs(1,1);
 bfs(n,2);
 int i,x,y;
 for(i=1;i<=m;i++)
  {
  x=M[i].x;
  y=M[i].y;
  if( (!(C[x][y]-Fx[x][y]) && (C[y][x]-Fx[y][x]) || !(C[y][x]-Fx[y][x]) && (C[x][y]-Fx[x][y])) && (s[x]+s[y]==3))
   sol[++nr]=i;
  }
 fprintf(fout,"%d\n",nr);
 for(i=1;i<=nr;i++)
  fprintf(fout,"%d\n",sol[i]);
 }
int main()
 {
 int i;
 read();
 f[1]=inf;
 while(bfs())
  {
  for(i=n;pre[i]!=-1;i=pre[i])
   {
   Fx[pre[i]][i]+=f[n];
   Fx[i][pre[i]]-=f[n];
   }
  f[1]=inf;
  }
 solve();
 return 0;
 }