Cod sursa(job #1495295)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 2 octombrie 2015 21:13:10
Problema Critice Scor 70
Compilator c Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <stdio.h>
#include <string.h>
#define MAXN 1000
#define MAXM 10000
int val[2*MAXM+1], next[2*MAXM+1], f[MAXN+1][MAXN+1], c[MAXN+1][MAXN+1], from[MAXN+1], q[MAXN+1], lista[MAXN+1], u[MAXN+1], a[MAXM], b[MAXM], ans[MAXM+1];
int k, n;
inline void adauga(int x, int y){
    k++;
    val[k]=y;
    next[k]=lista[x];
    lista[x]=k;
}
inline int bfs(){
    int st, dr, p;
    st=0;
    dr=1;
    q[0]=1;
    memset(from, 0, sizeof from);
    while(st<dr){
        p=lista[q[st]];
        while(p){
            if((val[p]!=1)&&(from[val[p]]==0)&&(c[q[st]][val[p]]-f[q[st]][val[p]]>0)){
                from[val[p]]=q[st];
                q[dr++]=val[p];
            }
            p=next[p];
        }
        if(from[n]){
            return 1;
        }
        st++;
    }
    return 0;
}
void dfs1(int x){
    int p=lista[x];
    u[x]=1;
    while(p){
        if((u[val[p]]!=1)&&(c[x][val[p]]>f[x][val[p]])&&(c[val[p]][x]>f[val[p]][x])){
            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[x][val[p]]>f[x][val[p]])&&(c[val[p]][x]>f[val[p]][x])){
            dfs2(val[p]);
        }
        p=next[p];
    }
}
int main(){
    int m, i, z, p, min;
    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]);
        adauga(b[i], a[i]);
        c[a[i]][b[i]]+=z;
        c[b[i]][a[i]]+=z;
    }
    while(bfs()){
        p=lista[n];
        while(p){
            if(from[val[p]]){
                min=c[val[p]][n]-f[val[p]][n];
                i=val[p];
                while(from[i]){
                    if(min>c[from[i]][i]-f[from[i]][i]){
                        min=c[from[i]][i]-f[from[i]][i];
                    }
                    i=from[i];
                }
                f[val[p]][n]+=min;
                f[n][val[p]]-=min;
                i=val[p];
                while(from[i]){
                    f[from[i]][i]+=min;
                    f[i][from[i]]-=min;
                    i=from[i];
                }
            }
            p=next[p];
        }
    }
    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;
}