Cod sursa(job #1760269)

Utilizator hackerinoHackerino hackerino Data 20 septembrie 2016 17:00:53
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<stdio.h>
#define Nm 1001
#define Mm 10001
#define Inf Nm*10000
#define min(a,b) ((a)<(b)?(a):(b))
int G[Nm][Nm],C[Nm][Nm],X[Mm],Y[Mm],D[Nm],n,m;
int F[Nm][Nm],A[Mm],Q[Nm],Pre[Nm],M[Nm],S[Nm],T[Nm];
void read(){int i,c;freopen("critice.in","r",stdin);scanf("%d%d",&n,&m);for(i=1;i<=m;i++){scanf("%d%d%d",X+i,Y+i,&c);G[X[i]][D[X[i]]++]=Y[i];G[Y[i]][D[Y[i]]++]=X[i];C[X[i]][Y[i]]=C[Y[i]][X[i]]=c;}}
int BFS_s(){
 int l,r,x,y,i;
 Q[l=r=0]=1;
 Pre[1]=-1;
 M[1]=Inf;
 for(i=2;i<=n;i++)Pre[i]=0;
 while(l<=r){
  x=Q[l++];
  for(i=0;i<D[x];i++){
   y=G[x][i];
   if(!Pre[y] && F[x][y]<C[x][y]){
    Pre[y]=x;
    M[y]=min(M[x],C[x][y]-F[x][y]);
    Q[++r]=y;
   }
  }
 }
 return Pre[n]!=0;
}
void BFS_t(){
 int l,r,x,y,i;
 Q[l=r=0]=n;
 T[n]=1;
 while(l<=r){
  x=Q[l++];
  for(i=0;i<D[x];i++){
   y=G[x][i];
   if(!T[y] && F[y][x]<C[y][x]){T[y]=1;Q[++r]=y;}
  }
 }
}
void solve(){int i;
 while(BFS_s()){i=n;while(i>1){F[Pre[i]][i]+=M[n];F[i][Pre[i]]-=M[n];i=Pre[i];}}
 for(i=1;i<=n;i++)if(Pre[i]){S[i]=1;}
 BFS_t();A[0]=0;
 for(i=1;i<=m;i++){if(S[X[i]]&&T[Y[i]]||S[Y[i]]&&T[X[i]])A[++A[0]]=i;}
}
void write(){int i;freopen("critice.out","w",stdout);printf("%d\n",A[0]);for(i=1;i<=A[0];i++)printf("%d\n",A[i]);}
int main(){read();solve();write();return 0;}