Cod sursa(job #2023210)

Utilizator Bodo171Bogdan Pop Bodo171 Data 18 septembrie 2017 15:53:39
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <iostream>
#include <fstream>
using namespace std;
const int nmax=1005;
short fl[nmax][nmax],c[nmax][nmax],q[nmax],prc[nmax],v[nmax][nmax],ans[10*nmax],vizD[nmax],A[10*nmax],B[10*nmax];
int n,m,start,nod,p,u,i,j,rez,a,b,cap,minfl;
bool bfs()
{
    for(i=2;i<=n;i++)
        prc[i]=0;
    prc[1]=-1;q[1]=1;p=u=1;
    while(p<=u)
    {
        start=q[p];p++;
        for(i=1;i<=v[start][0];i++)
        {
            nod=v[start][i];
            if((!prc[nod])&&fl[start][nod]<c[start][nod])
            {
                q[++u]=nod;
                prc[nod]=start;
            }
        }
    }
    return (prc[nod]!=0);
}
void dfs(int x)
{
    vizD[x]=1;
    for(int i=1;i<=v[x][0];i++)
        if((!vizD[v[x][i]])&&c[v[x][i]][x]>fl[v[x][i]][x])
         dfs(v[x][i]);
}
int main()
{
    ifstream f("critice.in");
    ofstream g("critice.out");
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>a>>b>>cap;
        c[a][b]=c[b][a]=cap;
        v[a][++v[a][0]]=b;
        v[b][++v[b][0]]=a;
        A[i]=a;B[i]=b;
    }
    while(bfs())
    {
        nod=n;minfl=30000;
        for(i=1;i<=v[n][0];i++)
        {
         nod=v[n][i];
         minfl=c[nod][n]-fl[nod][n];
         if(minfl&&prc[nod])
         {
            while(nod!=1)
         {
            minfl=min(minfl,c[prc[nod]][nod]-fl[prc[nod]][nod]);
            nod=prc[nod];
         }
         nod=v[n][i];
         fl[nod][n]+=minfl;
         fl[n][nod]-=minfl;
         while(nod!=1)
         {
            fl[prc[nod]][nod]+=minfl;
            fl[nod][prc[nod]]-=minfl;
            nod=prc[nod];
         }
         }
        }
    }
    dfs(n);
    for(i=1;i<=m;i++)
    {
        if((prc[A[i]]&&vizD[B[i]])||(vizD[A[i]]&&prc[B[i]]))
            ans[++rez]=i;
    }
    g<<rez<<'\n';
    for(i=1;i<=rez;i++)
        g<<ans[i]<<'\n';
    return 0;
}