Cod sursa(job #1516720)

Utilizator AndyCatrunaCatruna Andy AndyCatruna Data 3 noiembrie 2015 14:51:29
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.98 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define dim 1005
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int n,i,c[dim][dim],f[dim][dim],viz[dim],nod,sol[dim*10],k,t[dim],m,x,y,z,minim,viz1[dim],viz2[dim],v1[dim*10],v2[dim*10];
queue <int>q;
vector <int> v[dim];
int bfs(){
    while(!q.empty()){
        q.pop();
    }
    memset(viz,0,sizeof(viz));
    q.push(1);
    viz[1]=1;
    while(!q.empty()){
        int nod=q.front();
        if(nod==n){
            return 1;
        }
        for(int i=0;i<v[nod].size();i++){
            int vec=v[nod][i];
            if(viz[vec]==0 && c[nod][vec]>f[nod][vec]){
                t[vec]=nod;
                q.push(vec);
                viz[vec]=1;
            }
        }
        q.pop();
    }



    return 0;
}
void bfs1(){
    while(!q.empty()){
        q.pop();
    }
    q.push(1);
    viz1[1]=1;
    while(!q.empty()){
        int nod=q.front();
        for(int i = 0 ; i < v[nod].size() ; i++){
            int vecin = v[nod][i];
            if(viz1[vecin] == 0 && c[nod][vecin]>f[nod][vecin] && c[nod][vecin]>f[vecin][nod]){
                viz1[vecin] = 1;
                q.push(vecin);

            }
        }
        q.pop();
    }
}
void bfs2(){
    while(!q.empty()){
        q.pop();
    }
    q.push(n);
    viz2[n]=1;
    while(!q.empty()){
        int nod = q.front();
        for(int i = 0 ; i < v[nod].size() ; i++){
            int vecin = v[nod][i];
            if(viz2[vecin]== 0 && c[nod][vecin]>f[nod][vecin] && c[nod][vecin]>f[vecin][nod]){
                viz2[vecin]=1;
                q.push(vecin);
            }
        }
        q.pop();
    }
}
int main(){
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>x>>y>>z;
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y]=z;
        c[y][x]=z;
        v1[i]=x;
        v2[i]=y;
    }
    while(bfs()){
        for(i=0;i<v[n].size();i++){
            nod= v[n][i];
            if(viz[nod]){
                minim=c[nod][n]-f[nod][n];
                while(minim!=0 && t[nod]!=0){
                    minim=min(minim,c[t[nod]][nod]-f[t[nod]][nod]);
                    nod=t[nod];
                }
                if(minim){
                    nod=v[n][i];
                    f[nod][n]+=minim;
                    f[n][nod]-=minim;
                    while(t[nod]!=0){
                        f[t[nod]][nod]+=minim;
                        f[nod][t[nod]]-=minim;
                        nod=t[nod];
                    }
                }
            }
        }
    }
    bfs1();bfs2();
    for(i=1;i<=m;i++){
        x=v1[i];y=v2[i];
        if(c[x][y]==f[x][y] || c[y][x]==f[y][x]){
            if((viz1[x]==1 && viz2[y]==1) || (viz1[y]==1 && viz2[x]==1)){
                sol[++k]=i;
            }
        }
    }
    fout<<k<<"\n";
    for(i=1;i<=k;i++){
        fout<<sol[i]<<"\n";
    }

    return 0;
}