Cod sursa(job #1999561)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 11 iulie 2017 15:07:19
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <cstdio>
#include <cstring>
#include <vector>
#define MAXN 1000
#define MAXM 10000
#define INF 1000000000
std::vector <int> G[MAXN+1];
int cap[MAXN+1][MAXN+1];
int flux[MAXN+1][MAXN+1];
int poz[MAXN+1][MAXN+1];
int from[MAXN+1];
int sol[MAXM+1];
bool viz[MAXN+1];
int Q[MAXN+1];
bool viz2[2][MAXN+1];
inline bool BFS1(int n){
    int x,b,e,nod;
    memset(viz,0,sizeof(viz));
    memset(from,0,sizeof(from));
    viz[1]=1;
    Q[0]=1;
    b=0;
    e=1;
    do{
       nod=Q[b];
       b++;
       for(auto x:G[nod])
         if(viz[x]==0&&cap[nod][x]>flux[nod][x]){
            viz[x]=1;
            from[x]=nod;
            if(x<n)
              Q[e++]=x;
         }
    }while(b<e);
    return viz[n];
}
inline void BFS2(int s,int ind){
    int x,b,e,nod;
    Q[0]=s;
    viz2[ind][s]=1;
    b=0;
    e=1;
    do{
        nod=Q[b];
        b++;
        for(auto x:G[nod])
          if(viz2[ind][x]==0&&(cap[nod][x]>flux[nod][x]&&cap[x][nod]>flux[x][nod])){
             viz2[ind][x]=1;
             Q[e++]=x;
          }
    }while(b<e);
}
int main(){
    FILE*fi,*fout;
    int i,n,m,a,b,c,nod,min,ans,j,y;
    fi=fopen("critice.in" ,"r");
    fout=fopen("critice.out" ,"w");
    fscanf(fi,"%d %d " ,&n,&m);
    for(i=1;i<=m;i++){
        fscanf(fi,"%d %d %d " ,&a,&b,&c);
        poz[a][b]=i;
        poz[b][a]=i;
        G[a].push_back(b);
        G[b].push_back(a);
        cap[a][b]+=c;
        cap[b][a]+=c;
    }
    while(BFS1(n)){
        for(auto y:G[n])
        if(viz[y]==1&&flux[y][n]<cap[y][n]){
          from[n]=y;
          nod=n;
          min=INF;
          while(from[nod]>0){
            if(min>cap[from[nod]][nod]-flux[from[nod]][nod])
                min=cap[from[nod]][nod]-flux[from[nod]][nod];
            nod=from[nod];
          }
          nod=n;
          while(from[nod]>0){
            flux[from[nod]][nod]+=min;
            flux[nod][from[nod]]-=min;
            nod=from[nod];
         }
      }
    }
    BFS2(1,0);
    BFS2(n,1);
    ans=0;
    for(i=1;i<=n;i++)
       for(j=1;j<=n;j++)
        if(cap[i][j]>0&&flux[i][j]==cap[i][j]&&(viz2[0][i]+viz2[1][j]==2||viz2[1][i]+viz2[0][j]==2)){
          ans++;
          sol[ans]=poz[i][j];
        }
    fprintf(fout,"%d\n" ,ans);
    for(i=1;i<=ans;i++)
       fprintf(fout,"%d\n" ,sol[i]);
    fclose(fi);
    fclose(fout);
    return 0;
}