Cod sursa(job #1869972)

Utilizator delia_99Delia Draghici delia_99 Data 6 februarie 2017 11:49:39
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.85 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#define NMAX 1000
#define MMAX 10000
#define inf 1000000

using namespace std;

int n,m,i;
int T[NMAX+5],C[NMAX+5][NMAX+5],F[NMAX+5][NMAX+5],sat[2][NMAX+5];
queue <int> q;
vector <int> sol,G[NMAX+5];
vector <pair <int,int> > v;

bool bfs()
{
    int i,node,s,son;
    bool ok=false;

    for(i=1; i<=n; ++i)
        T[i]=0;

    q.push(1);
    T[1]=-1;

    while(!q.empty())
    {
        node=q.front();
        q.pop();

        s=G[node].size();
        for(i=0; i<s; ++i)
        {
            son=G[node][i];

            if(!T[son] && C[node][son]>F[node][son])
            {
                if(son==n)
                    ok=true;
                else
                {
                    T[son]=node;
                    q.push(son);
                }
            }
        }
    }

    return ok;
}

void maxflow()
{
    int i,s=G[n].size(),flux,node;

    while(bfs())
    {
        for(i=0; i<s; ++i)
        {
            flux=inf;
            T[n]=G[n][i];
            node=n;

            while(T[node]!=-1 && flux)
            {
                flux=min(flux,C[T[node]][node]-F[T[node]][node]);
                node=T[node];
            }

            if(!flux)
                continue;

            node=n;
            while(T[node]!=-1)
            {
                F[T[node]][node]+=flux;
                F[node][T[node]]-=flux;
                node=T[node];
            }
        }
    }
}

void bfs2(int node,int ind,int endd)
{
    int i,s,son;
    q.push(node);

    sat[ind][node]=1;

    while(!q.empty())
    {
        node=q.front();
        q.pop();

        s=G[node].size();
        for(i=0; i<s; ++i)
        {
            son=G[node][i];

            if(!sat[ind][son] && C[node][son]>F[node][son])
            {
                sat[ind][son]=1;
                if(son!=endd)
                    q.push(son);
            }
        }
    }
}

int main()
{
    freopen("critice.in","r",stdin);
    freopen("critice.out","w",stdout);

    scanf("%d%d",&n,&m);

    for(i=1; i<=m; ++i)
    {
        int x,y,c;

        scanf("%d%d%d",&x,&y,&c);

        G[x].push_back(y);
        G[y].push_back(x);
        C[x][y]=c;
        C[y][x]=c;

        v.push_back(make_pair(x,y));
    }

    maxflow();
    bfs2(1,0,n);
    bfs2(n,1,1);

    for(i=0; i<m; ++i)
    {
        int node1=v[i].first,node2=v[i].second;

        if(F[node1][node2]<C[node1][node2] && F[node2][node1]<C[node2][node1])
            continue;

        if((sat[0][node1] && sat[1][node2]) || (sat[1][node1] && sat[0][node2]))
            sol.push_back(i+1);
    }

    printf("%d\n",sol.size());

    int s=sol.size();
    for(i=0; i<s; ++i)
        printf("%d\n",sol[i]);

    return 0;
}