Cod sursa(job #1209587)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 18 iulie 2014 03:27:53
Problema Critice Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
vector<int>L[10010];
struct can{
    int a;
    int b;
}z[10010];
int n,m,i,j,a,c[1010][1010],x[1010][1010],v[10010],t[10010],q[10010],y[10010],Y[10010],p,u,vmin,s[10010],nr;
FILE *f,*g;
int bfs(){
    int i,a;
    memset(v,0,sizeof(v));
    memset(y,0,sizeof(y));
    p=u=1;
    q[1]=1;
    v[1]=1;
    y[1]=1;
    while(p<=u){
        a=q[p];
        for(i=0;i<L[a].size();i++){
            if(v[L[a][i]]==0&&c[a][L[a][i]]>x[a][L[a][i]]){
                q[++u]=L[a][i];
                v[L[a][i]]=1;
                t[L[a][i]]=a;
                y[L[a][i]]=1;
            }
        }
        p++;
    }
    return v[n];
}
void sfb(){
    int i,a;
    memset(v,0,sizeof(v));
    p=u=1;
    q[1]=n;
    v[n]=1;
    Y[n]=1;
    while(p<=u){
        a=q[p];
        for(i=0;i<L[a].size();i++){
            if(v[L[a][i]]==0&&c[a][L[a][i]]>x[a][L[a][i]]*(-1)){
                q[++u]=L[a][i];
                v[L[a][i]]=1;
                t[L[a][i]]=a;
                Y[L[a][i]]=1;
            }
        }
        p++;
    }
}
int main(){
    f=fopen("critice.in","r");
    g=fopen("critice.out","w");
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=m;i++){
        fscanf(f,"%d%d%d",&z[i].a,&z[i].b,&a);
        L[z[i].a].push_back(z[i].b);
        L[z[i].b].push_back(z[i].a);
        c[z[i].a][z[i].b]=a;
    }
    while(bfs()){
        for(i=0;i<L[n].size();i++){
            a=L[n][i];
            if(v[a]==1&&c[a][n]>x[a][n]){
                vmin=c[a][n]-x[a][n];
                while(t[a]!=0){
                    if(vmin>c[t[a]][a]-x[t[a]][a])
                        vmin=c[t[a]][a]-x[t[a]][a];
                    a=t[a];
                }
                a=L[n][i];
                x[a][n]+=vmin;
                x[n][a]-=vmin;
                while(t[a]!=0){
                    x[t[a]][a]+=vmin;
                    x[a][t[a]]-=vmin;
                    a=t[a];
                }
            }
        }
    }
    bfs();
    sfb();
    for(i=1;i<=m;i++){
        if((y[z[i].a]==1&&Y[z[i].b]==1)||(y[z[i].b]==1&&Y[z[i].a]==1)){
            s[++nr]=i;
        }
    }
    fprintf(g,"%d\n",nr);
    for(i=1;i<=nr;i++){
        fprintf(g,"%d\n",s[i]);
    }





    fclose(f);
    fclose(g);
    return 0;
}