Cod sursa(job #1091576)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 25 ianuarie 2014 20:36:05
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.6 kb
#include <fstream>
#include <queue>
#include <list>
#include <bitset>
#include <algorithm>
#include <utility>
#include <map>
#include <vector>

using namespace std;

list<int> graf[1005];
int n,cap[1005][1005],prec[1005];
bitset<1005> viz;
queue<int> coada;
map<pair<int,int>,int > harta;
int cul[1005];

//De pus caz particular cu n=1
inline bool bfs()
{
    int i,y;
    for(i=2;i<=n;i++)
        viz[i]=0;
    while(!coada.empty())
        coada.pop();

    coada.push(1);
    viz[1]=1;
    prec[1]=0;

    list<int>::iterator it;
    while(!coada.empty())
    {
        y=coada.front();
        coada.pop();

        for(it=graf[y].begin();it!=graf[y].end();it++)
            if(cap[y][*it])
                if(!viz[*it])
                {
                    viz[*it]=1;
                    prec[*it]=y;
                    coada.push(*it);
                }
    }

    if(viz[n])
        return 1;
    return 0;
}

int flux;
void dinic()
{
    int i;
    int minim;
    int aux;
    while(bfs())
    {
        for(i=n-1;i>0;i--)
            if(cap[i][n])
                if(viz[i])
                {
                    aux=i;
                    minim=cap[i][n];
                    while(prec[aux])
                    {
                        minim=min(minim,cap[prec[aux]][aux]);
                        aux=prec[aux];
                    }
                    flux+=minim;

                    aux=i;
                    while(prec[aux])
                    {
                        cap[prec[aux]][aux]-=minim;
                        cap[aux][prec[aux]]+=minim;
                        aux=prec[aux];
                    }
                }
    }
}

void bfs2()
{

    int y;

    coada.push(1);
    cul[1]=1;

    list<int>::iterator it;
    while(!coada.empty())
    {
        y=coada.front();
        coada.pop();

        for(it=graf[y].begin();it!=graf[y].end();it++)
            if(cap[y][*it])
                if(!cul[*it])
                {
                    cul[*it]=1;
                    coada.push(*it);
                }
    }

    coada.push(n);
    cul[n]=2;

    while(!coada.empty())
    {
        y=coada.front();
        coada.pop();

        for(it=graf[y].begin();it!=graf[y].end();it++)
            if(cap[*it][y])
                if(!cul[*it])
                {
                    cul[*it]=2;
                    coada.push(*it);
                }
    }
}

    vector<int> rasp;

int main()
{
    ifstream cin("critice.in");
    ofstream cout("critice.out");

    int m=0,i,a,b,c;
    cin>>n>>m;

    for(i=1;i<=m;i++)
    {
        cin>>a>>b>>c;
        harta[make_pair(a,b)]=i;
        harta[make_pair(b,a)]=i;
        graf[a].push_back(b);
        graf[b].push_back(a);
        cap[a][b]+=c; //Punem apoi si =
        cap[b][a]+=c; //-=-
    }
    if(n==1)
    {
        cout<<"0\n";
        cin.close();
        cout.close();
        return 0;
    }
    dinic();
    bfs2();
    list<int>::iterator it2;

    for(i=1;i<n;i++)
        if(cul[i]==1)
        {
            for(it2=graf[i].begin();it2!=graf[i].end();it2++)
            {
                if(cul[*it2]==2 && (c[i][*it2]==0 || c[*it2][i]==0))
                {
                    rasp.push_back(harta[make_pair(i,*it2)]);
                }
            }
        }

    sort(rasp.begin(),rasp.end());
    cout<<rasp.size()<<'\n';
    vector<int>::iterator it;
    for(it=rasp.begin();it!=rasp.end();it++)
        cout<<*it<<'\n';
    //cout<<flux<<endl;
    cin.close();
    cout.close();
    return 0;
}