Cod sursa(job #1383944)

Utilizator crisovidiuCristian Ovi crisovidiu Data 10 martie 2015 19:26:41
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.87 kb
//#include <iostream>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <bitset>
#include <limits>
#include <fstream>
#include <cstring>
#include <iomanip>
#include <cstdlib>
#include <algorithm>
using namespace std;
ifstream cin("critice.in");
ofstream cout("critice.out");

#define nmax 1010
#define mod 1000007
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define inf numeric_limits<int>::max()
#define forv(v,it) for (vector<int>::iterator it=v.begin();it!=v.end();it++)

int n,m,x,y,z,c[nmax][nmax],f[nmax][nmax],viz[nmax],t[nmax],q[10*nmax],e[nmax][nmax],flmin;
int c2[nmax][nmax],f2[nmax][nmax],viz2[nmax],t2[nmax],q2[10*nmax];
vector<int> g[nmax],p,r;

int bfs()
{
    int i,j,nod,vecin;
    for (i=1;i<=n;i++)
        viz[i]=0;
    q[0]=q[1]=1;
    for (i=1;i<=q[0];i++)
    {
        nod=q[i];
        if (nod==n)
            continue;
        forv(g[nod],it)
        {
            vecin=*it;
            if (c[nod][vecin]==f[nod][vecin] || viz[vecin])
                continue;
            viz[vecin]=1;
            t[vecin]=nod;
            q[++q[0]]=vecin;
        }
    }
    return viz[n];
}

int bfs2()
{
    int i,j,nod,vecin;
    for (i=1;i<=n;i++)
        viz2[i]=0;
    q2[0]=q2[1]=n;
    for (i=1;i<=q2[0];i++)
    {
        nod=q2[i];
        if (nod==1)
            continue;
        forv(g[nod],it)
        {
            vecin=*it;
            if (c2[nod][vecin]==f2[nod][vecin] || viz2[vecin])
                continue;
            viz2[vecin]=1;
            t2[vecin]=nod;
            q2[++q2[0]]=vecin;
        }
    }
    return viz2[1];
}

int main()
{
    int i,j,nod,vecin;
    cin>>n>>m;
    for (i=1;i<=m;i++)
    {
        cin>>x>>y>>z;
        g[x].pb(y);
        g[y].pb(x);
        c[x][y]=z;
        c[y][x]=z;
        c2[x][y]=z;
        c2[y][x]=z;
        e[x][y]=i;
        e[y][x]=i;
    }
    while (bfs())
    {
        forv(g[n],it)
        {
            vecin=*it;
            if (c[vecin][n]==f[vecin][n])
            {
                p.pb(e[vecin][n]);
                continue;
            }
            if (!viz[vecin])
                continue;
            t[n]=vecin;
            flmin=inf;
            for (nod=n;nod!=1;nod=t[nod])
            {
                if (flmin>c[t[nod]][nod]-f[t[nod]][nod])
                {
                    flmin=c[t[nod]][nod]-f[t[nod]][nod];
                    if (c[t[nod]][nod]==f[t[nod]][nod])
                        p.pb(e[t[nod]][nod]);
                }
            }
            if (!flmin)
                continue;
            for (nod=n;nod!=1;nod=t[nod])
            {
                f[t[nod]][nod]+=flmin;
                f[nod][t[nod]]-=flmin;
            }
        }
    }
    while (bfs2())
    {
        forv(g[n],it)
        {
            vecin=*it;
            if (c2[vecin][1]==f2[vecin][1])
            {
                r.pb(e[vecin][1]);
                continue;
            }
            if (!viz2[vecin])
                continue;
            t2[n]=vecin;
            flmin=inf;
            for (nod=1;nod!=n;nod=t2[nod])
            {
                if (flmin>c2[t2[nod]][nod]-f2[t2[nod]][nod])
                {
                    flmin=c2[t2[nod]][nod]-f2[t2[nod]][nod];
                    if (c2[t2[nod]][nod]==f2[t2[nod]][nod])
                        r.pb(e[t2[nod]][nod]);
                }
            }
            if (!flmin)
                continue;
            for (nod=1;nod!=n;nod=t2[nod])
            {
                f2[t2[nod]][nod]+=flmin;
                f2[nod][t2[nod]]-=flmin;
            }
        }
    }
    forv(r,it)
        p.pb(*it);
    sort(p.begin(),p.end());
    p.erase(unique(p.begin(),p.end()),p.end());
    cout<<p.size()<<'\n';
    forv(p,it)
        cout<<*it<<'\n';
}