Cod sursa(job #1602145)

Utilizator livliviLivia Magureanu livlivi Data 16 februarie 2016 16:30:33
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.98 kb
#include<cstdio>
#include<bitset>
#include<queue>
#include<vector>
#include<algorithm>
#define N 1000
#define M 10000
using namespace std;

int lst[N+1];
int urm[2*M+1];
int vecin[2*M+1];

int c[N+1][N+1];
int f[N+1][N+1];
int n;

bitset<N+1> viz;
bitset<N+1> viz2;
int tata[N+1];
int R;

int minim(int a,int b){
    return (a<b) ? a : b;
}

void bfsinv(){
    viz2.reset();

    int nod,i,p;
    queue<int> q;

    q.push(n);
    viz2.set(n);

    while(!q.empty()){
        nod=q.front();
        //if (nod==n) break ;
        q.pop();

        p=lst[nod];
        while(p!=0){
            i=vecin[p];
            if (c[i][nod]-f[i][nod]>0 &&viz2[i]==false){
                viz2.set(i);
                tata[i]=nod;
                q.push(i);
                //if (i==n) break ;
            }
            p=urm[p];
        }
    }
}

bool bfs(){
    viz.reset();

    int nod,i,p;
    queue<int> q;

    q.push(1);
    viz.set(1);

    while(!q.empty()){
        nod=q.front();
        if (nod==n) break ;
        q.pop();

        p=lst[nod];
        while(p!=0){
            i=vecin[p];
            if (c[nod][i]-f[nod][i]>0 &&viz[i]==false){
                viz.set(i);
                tata[i]=nod;
                q.push(i);
                if (i==n) break ;
            }
            p=urm[p];
        }
    }

    return viz[n];
}

void solve(){
    int i,min;

    while(bfs()){
        for(i=1;i<n;i++)
            if (c[i][n]-f[i][n]!=0 &&viz[i]==true){
                tata[n]=i;

                int nod=n;
                min=c[tata[nod]][nod]-f[tata[nod]][nod];
                while(nod!=1){
                    min=minim(min,c[tata[nod]][nod]-f[tata[nod]][nod]);
                    nod=tata[nod];
                }

                R+=min;
                nod=n;
                while(nod!=1){
                    f[tata[nod]][nod]+=min;
                    f[nod][tata[nod]]-=min;
                    nod=tata[nod];
                }
            }
    }
}

void adauga(int x,int y,int i){
    vecin[i*2-1]=y;
    urm[i*2-1]=lst[x];
    lst[x]=i*2-1;

    vecin[i*2]=x;
    urm[i*2]=lst[y];
    lst[y]=i*2;
}


int main(){
    freopen ("critice.in","r",stdin);
    freopen ("critice.out","w",stdout);
    int m,i,x,y;

    scanf ("%d%d",&n,&m);
    for(i=1;i<=m;i++){
        scanf ("%d%d",&x,&y);
        scanf ("%d",&c[x][y]);
        c[y][x]=c[x][y];
        adauga(x,y,i);
    }

    solve();

    vector<int> sol;

    bfs();
    bfsinv();

    for(i=1;i<=n;i++){
        x=lst[i];
        while(x!=0){
            if (vecin[x]!=0){
                if (viz[i]==1 &&viz2[vecin[x]]==1 &&c[i][vecin[x]]==f[i][vecin[x]]){
                    sol.push_back((x+1)/2);
                }
		     }
            x=urm[x];
        }
    }

	sort(sol.begin(),sol.end());
    printf ("%d\n", sol.size());
    for(i=0;i<sol.size();i++)
         printf ("%d\n",sol[i]);

    return 0;
}