Cod sursa(job #1726954)

Utilizator ade_tomiEnache Adelina ade_tomi Data 9 iulie 2016 16:18:27
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.89 kb
#include<iostream>
#include<fstream>
#include<cstring>
#define MMAX 10004
#define NMAX 1003
#include<vector>
using namespace std;
int pred[NMAX],q[NMAX],cap[NMAX][NMAX],f[NMAX][NMAX],viz[3][NMAX];
vector<pair<int,int> > g;
vector<int> sol,v[NMAX];

void bfs(int s, int t)
{
    int i;

    int start,stop;
    start=1;
    q[start]=s;
    stop=1;
    start=0;
    pred[s]=-2;

    while(start<stop&&q[start]!=t)
    {
        start++;
        int nod=q[start];

        for(i=0; i<v[nod].size(); i++)
        {
            if(pred[v[nod][i]]==-1&&f[nod][v[nod][i]]!=cap[nod][v[nod][i]])
            {

                pred[v[nod][i]]=nod;
                stop++;
                q[stop]=v[nod][i];
            }

        }


    }
}

void flux(int n,int s,int t)
{
    int ss=0;
    while(1)
    {
        memset(pred,-1,sizeof(pred));
        bfs(1,t);

        if(pred[t]==-1)
            break;
        int capmin=0;
        for(int nod=1; nod<=n; nod++)
        {


            if(pred[nod]!=-1&&cap[nod][t]!=f[nod][t])
            {


                capmin=cap[nod][t]-f[nod][t];
            //    cout<<nod<<" "<<t<<"\n";
                for(int vv=nod,u=pred[vv]; u>0; vv=u,u=pred[vv])
                {

             //       cout<<vv<<" "<<u<<"\n";

                    capmin=min(capmin,cap[u][vv]-f[u][vv]);
                }
                if(!capmin)
                    continue;

                f[nod][t]+=capmin;
                f[t][nod]-=capmin;

                for(int vv=nod,u=pred[vv]; u>0; vv=u,u=pred[vv])
                {

                    f[u][vv]+=capmin;
                    f[vv][u]-=capmin;
                }


            }
            cout<<capmin<<"\n";
            capmin=0;
        }
    }
  //  cout<<"flux="<<ss;
}



void dfs(int x, int add)
{


    viz[add][x]=1;

    for(int i=0; i<v[x].size(); i++)
    {

        if(viz[add][v[x][i]]==0)
            dfs(v[x][i],add);
    }


}

int main()
{
    int i,n,m,a,b,cost;

    ifstream cin("critice.in");
    ofstream cout("critice.out");
    cin>>n>>m;
    for(i=1; i<=m; i++)
    {
        cin>>a>>b>>cost;

        cap[a][b]=cap[b][a]=cost;
        g.push_back(make_pair(a,b));
        v[a].push_back(b);
        v[b].push_back(a);

    }
    flux(n,1,n);
    dfs(1,1);
    dfs(n,2);
    for(i=0; i<m; i++)
    {
       if(f[g[i].first][g[i].second]==cap[g[i].first][g[i].second]&&viz[1][g[i].first]==1&&viz[2][g[i].second]==1)
            sol.push_back(i+1);
        else
        {

            swap(g[i].first,g[i].second);
            if(f[g[i].first][g[i].second]==cap[g[i].first][g[i].second]&&viz[1][g[i].first]==1&&viz[2][g[i].second]==1)
                sol.push_back(i+1);
        }


    }
    cout<<sol.size()<<"\n";
    for(i=0; i<sol.size(); i++)
        cout<<sol[i]<<"\n";
    return 0;



}