Cod sursa(job #1760267)

Utilizator hackerinoHackerino hackerino Data 20 septembrie 2016 16:56:10
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<cstdio>
#define Nm 1001
#define Mm 10001
#define Inf Nm*10000
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
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;
 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;}