Cod sursa(job #748631)

Utilizator MagnvsDaniel Constantin Anghel Magnvs Data 14 mai 2012 11:40:27
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <cstdio>
#include <vector>

using namespace std;

int c[1024][1024],f[1024][1024],aux[1024][1024],v[1024],q[1024],w[10001],p[1024],vis[1024],n;
vector <int> g[1024];

int bfs()
{
    int i,j,a,b;
    for (i=2;i<=n;++i) v[i]=0;
    v[1]=1;q[0]=1;q[1]=1;
    for (i=1;i<=q[0];++i)
    {
        a=q[i];
        if (a!=n)
            for (j=0;j<g[a].size();++j)
            {
                b=g[a][j];
                if ((c[a][b]>f[a][b])&&(!v[b]))
                {
                    ++q[0];
                    q[q[0]]=b;
                    p[b]=a;
                    v[b]=1;
                }
            }
    }
    return v[n];
}

void dfs(int x,int y)
{
    int i;
    for (i=0;i<g[x].size();++i)
        if (c[x][g[x][i]]-f[x][g[x][i]]&&!vis[g[x][i]])
        {
            vis[g[x][i]]=y;
            dfs(g[x][i],y);
        }
}

int main()
{
    int sol=0,m,i,j,a,x,y,z,t;
    freopen("critice.in","r",stdin);
    freopen("critice.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&z);
        g[x].push_back(y);
        g[y].push_back(x);
        c[x][y]=z;
        c[y][x]=z;
        aux[x][y]=i;
        aux[y][x]=i;
    }
    while (bfs())
        for (i=0;i<g[n].size();++i)
        {
            a=g[n][i];
            if ((c[a][n]>f[a][n])&&v[a])
            {
                p[n]=a;
                t=200000;
                for (a=n;a!=1;a=p[a])
                    t=min(t,c[p[a]][a]-f[p[a]][a]);
                a=p[n];
                for (a=n;a!=1;a=p[a])
                    {
                        f[p[a]][a]+=t;
                        f[a][p[a]]-=t;
                    }
            }
        }
    vis[1]=1;
    vis[n]=2;
    dfs(1,1);
    dfs(n,2);
    for (i=1;i<=n;++i)
        for (j=0;j<g[i].size();++j)
            if (c[i][g[i][j]]&&(c[i][g[i][j]]-f[i][g[i][j]]==0||c[i][g[i][j]]+f[i][g[i][j]]==0)&&vis[i]==1&&vis[g[i][j]]==2)
            {
                ++sol;
                w[sol]=aux[i][g[i][j]];
            }
    printf("%d\n",sol);
    for (i=1;i<=sol;++i)
        printf("%d\n",w[i]);
    return 0;
}