Cod sursa(job #1495399)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 3 octombrie 2015 00:29:31
Problema Critice Scor 70
Compilator c Status done
Runda Arhiva de probleme Marime 2.73 kb
#include <stdio.h>
#include <string.h>
#define NIL -1
#define INF 1000000000
#define MAXN 1000
#define MAXM 10000
int c[2*MAXM+1], f[2*MAXM+1], from[MAXN+1], n, q[MAXN+1], h, val[2*MAXM+1], next[2*MAXM+1], lista[MAXN+1], e[MAXN+1], ans[MAXN+1], a[MAXM], b[MAXM];
int u[MAXN+1];
inline void adauga(int x, int y, int z){
    h++;
    c[h]=z;
    f[h]=0;
    val[h]=y;
    next[h]=lista[x];
    lista[x]=h;
}
void dfs1(int x){
    int p=lista[x];
    u[x]=1;
    while(p){
        if((u[val[p]]!=1)&&(c[p]!=f[p])&&(c[p]!=-f[p])){
            dfs1(val[p]);
        }
        p=next[p];
    }
}
void dfs2(int x){
    int p=lista[x];
    u[x]=2;
    while(p){
        if((u[val[p]]!=2)&&(c[p]!=f[p])&&(c[p]!=-f[p])){
            dfs2(val[p]);
        }
        p=next[p];
    }
}
inline int bfs(){
    int st, dr, p;
    st=0;
    dr=1;
    q[0]=1;
    for(p=1; p<=n; p++){
        from[p]=NIL;
    }
    memset(e, 0, sizeof e);
    while((st<dr)&&(from[n]==NIL)){
        for(p=lista[q[st]]; p; p=next[p]){
            if((from[val[p]]==NIL)&&(c[p]>f[p])){
                from[val[p]]=q[st];
                e[val[p]]=p;
                q[dr++]=val[p];
            }
        }
        st++;
    }
    return (from[n]!=NIL);
}
int main(){
    int m, i, z, min, p, q;
    FILE *fin, *fout;
    fin=fopen("critice.in", "r");
    fout=fopen("critice.out", "w");
    fscanf(fin, "%d%d", &n, &m);
    for(i=0; i<m; i++){
        fscanf(fin, "%d%d%d", &a[i], &b[i], &z);
        adauga(a[i], b[i], z);
        adauga(b[i], a[i], z);
    }
    while(bfs()){
        for(p=lista[n]; p; p=next[p]){
            if(p%2==0){
                q=p-1;
            }else{
                q=p+1;
            }
            if((from[val[p]]!=NIL)&&(c[q]>f[q])){
                min=c[q]-f[q];
                i=val[p];
                while(i!=1){
                    if(min>c[e[i]]-f[e[i]]){
                        min=c[e[i]]-f[e[i]];
                    }
                    i=from[i];
                }
                f[q]+=min;
                f[p]-=min;
                i=val[p];
                while(i!=1){
                    f[e[i]]+=min;
                    if(e[i]%2==0){
                        f[e[i]-1]-=min;
                    }else{
                        f[e[i]+1]-=min;
                    }
                    i=from[i];
                }
            }
        }
    }
    dfs1(1);
    dfs2(n);
    ans[0]=0;
    for(i=0; i<m; i++){
        if(((u[a[i]]==1)&&(u[b[i]]==2))||((u[a[i]]==2)&&(u[b[i]]==1))){
            ans[++ans[0]]=i+1;
        }
    }
    for(i=0; i<=ans[0]; i++){
        fprintf(fout, "%d\n", ans[i]);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}