Cod sursa(job #1829037)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 14 decembrie 2016 11:12:38
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 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];
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;
            Q[e++]=x;
         }
    }while(b<e);
    return viz[n];
}
inline char BFS2(int s,int d){
    int x,b,e,nod;
    memset(viz,0,sizeof(viz));
    Q[0]=s;
    viz[s]=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]&&cap[x][nod]>flux[x][nod])){
             viz[x]=1;
             Q[e++]=x;
          }
    }while(b<e);
    return viz[d];
}
int main(){
    FILE*fi,*fout;
    int i,n,m,a,b,c,nod,min,ans,j;
    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)){
        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];
        }
    }
    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]&&(BFS2(i,1)+BFS2(j,n)==2||BFS2(j,1)+BFS2(i,n)==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;
}