Cod sursa(job #1091684)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 25 ianuarie 2014 22:14:18
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.25 kb
#include <fstream>
#include <queue>
#include <bitset>
#include <algorithm>
#include <utility>
//#include <map>
#include <vector>

using namespace std;

vector<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;

    vector<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;
                    if(*it==n)
                        break;
                    coada.push(*it);
                }
    }

    return viz[n];
}

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

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

inline void bfs2()
{

    int y;

    while(!coada.empty())
        coada.pop();
    coada.push(1);
    cul[1]=1;

    vector<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[y][*it])
                if(!cul[*it])
                {
                    cul[*it]=2;
                    coada.push(*it);
                }
    }
}

vector<pair<int,int> > muchii;
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;
        muchii.push_back(make_pair(a,b));
        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();
    vector<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 && (cap[i][*it2]==0))
                {
                    rasp.push_back(harta[make_pair(i,*it2)]);
                }
            }
        }
*/
    vector<pair<int,int> >::iterator it3;
    vector<int>::iterator it;
    for(i=0;i<m;i++)
    {
        if(cul[muchii[i].first]==1 && cul[muchii[i].second]==2)// && (cap[muchii[i].first][muchii[i].second]==0 || cap[muchii[i].second][muchii[i].first]==0))
            rasp.push_back(i+1);
        if(cul[muchii[i].first]==2 && cul[muchii[i].second]==1)// && (cap[muchii[i].second][muchii[i].first]==0 || cap[muchii[i].first][muchii[i].second]==0))
            rasp.push_back(i+1);
    }

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