Cod sursa(job #626760)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 28 octombrie 2011 09:47:03
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3 kb
#include<fstream>
#include<vector>
#include<queue>
#define N 1001
using namespace std;

ifstream in("critice.in");
ofstream out("critice.out");

int n,m,co[N][N],flux[N][N],p[N],nrm[N][N];
vector<pair<int,int> > g[N];
bool viz[N],ver1[N],ver2[N];

bool bf() {
    queue<int> q;
    vector<pair<int,int> >::iterator it;
    int i;

    for(i=1;i<=n;++i) {

        viz[i]=false;
        p[i]=0;
    }

    q.push(1);

    while(!q.empty()) {

        for(it=g[q.front()].begin();it!=g[q.front()].end();++it) if(!viz[it->first] && co[q.front()][it->first] - flux[q.front()][it->first]>0) {

            q.push(it->first);
            p[it->first]=q.front();
            viz[it->first]=true;

        }

        q.pop();
    }

    if(!p[n])
        return 0;
    return 1;

}

void dinic() {
    int i,j,smin;

    while(bf())
        for(j=1;j!=n;++j) if(co[j][n] - flux[j][n]>0) {

            smin=1<<20;

            if(co[j][n] - flux[j][n]<smin)
                smin=co[j][n] - flux[j][n];

            for(i=j;i!=1;i=p[i])
                if(co[p[i]][i] - flux[p[i]][i]<smin)
                    smin=co[p[i]][i] - flux[p[i]][i];

            if(smin==1<<20)
                continue;

            flux[j][n]+=smin;
            flux[n][j]-=smin;

            for(i=j;i!=1;i=p[i]) {

                flux[p[i]][i]+=smin;
                flux[i][p[i]]-=smin;

            }

        }

}

void bf1() {
    queue<int> q;
    vector<pair<int,int> >::iterator it;

    q.push(1); ver1[1]=true;

    while(!q.empty()) {

        for(it=g[q.front()].begin();it!=g[q.front()].end();++it) if(!ver1[it->first] && co[q.front()][it->first] - flux[q.front()][it->first]>0) {

            ver1[it->first]=true;
            q.push(it->first);

        }

        q.pop();
    }


}

void bf2() {
    queue<int> q;
    vector<pair<int,int> >::iterator it;

    q.push(n); ver2[n]=true;

    while(!q.empty()) {

        for(it=g[q.front()].begin();it!=g[q.front()].end();++it) if(!ver2[it->first] && co[it->first][q.front()] - flux[it->first][q.front()]>0) {

            ver2[it->first]=true;
            q.push(it->first);

        }

        q.pop();
    }


}

int main() {
    int i,a,b,c,nr=0;
    vector<pair<int,int> >::iterator it;

    in >> n >> m;

    for(i=1;i<=m;++i) {

        in >> a >> b >> c;

        g[a].push_back(pair<int,int>(b,i));
        g[b].push_back(pair<int,int>(a,i));
        co[a][b]+=c;
        co[b][a]+=c;
        nrm[a][b]=nrm[b][a]=i;

    }

    dinic();

    bf1();
    bf2();

    for(i=1;i<=n;++i)
        for(it=g[i].begin();it!=g[i].end();++it)
            if(ver1[i] && !ver1[it->first] && ver2[it->first] && !ver2[i])
                ++nr;

    out << nr << "\n";

    for(i=1;i<=n;++i)
        for(it=g[i].begin();it!=g[i].end();++it)
            if(ver1[i] && !ver1[it->first] && ver2[it->first] && !ver2[i])
                out << nrm[i][it->first] << "\n";

    return 0;
}