Cod sursa(job #2209051)

Utilizator lucaperjuLuca Perju Verzotti lucaperju Data 1 iunie 2018 16:50:12
Problema Critice Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
using namespace std;
ifstream in ("critice.in");
ofstream out ("critice.out");
//vector <int> v[1005];
int n,m,pred[1005],c[1002][1002],f[1002][1002],q[1002],viz[1002],x1[10003],x2[10003];
void reset_viz()
{
    for(int i=1;i<=n;++i)
        viz[i]=0;
}
void citire ()
{
    int i,a,b,cc;
    in>>n>>m;
    for(i=1;i<=m;++i)
    {
        in>>a>>b>>cc;
   //     v[a].push_back(b);
        c[a][b]=cc;
        c[b][a]=cc;
        x1[i]=a;
        x2[i]=b;
    }
}
bool bfs (int s)
{
    int st=0,dr=-1,x,y;
    reset_viz();
    q[++dr]=s;
    while(st<=dr)
    {
        x=q[st++];
        viz[x]=1;
        for(y=1;y<=n;++y)
            if(!viz[y] && c[x][y]>f[x][y])
            {
                q[++dr]=y;
                pred[y]=x;
                if(y==n)
                    return true;
            }
    }
    return false;
}
int min_drum()
{
    int x=n,vmin=99999999;
    while(x!=1)
    {
        vmin=min(vmin,c[pred[x]][x]-f[pred[x]][x]);
        x=pred[x];
    }
    return vmin;
}
void actualizare_drum(int vmin)
{
    int x=n;
    while(x!=1)
    {
        f[pred[x]][x]+=vmin;
        f[x][pred[x]]-=vmin;
        x=pred[x];
    }
}
int main()
{
    int vmin,i,cnt=0;
    citire();
    while(bfs(1))
    {
        vmin=min_drum();
        actualizare_drum(vmin);
    }
    for(i=1;i<=m;++i)
        if(f[x1[i]][x2[i]]==c[x1[i]][x2[i]] && bfs(x2[i]) || f[x2[i]][x1[i]]==c[x2[i]][x1[i]] && bfs(x1[i]))
            cnt++;
    out<<cnt<<'\n';
    for(i=1;i<=m;++i)
        if(f[x1[i]][x2[i]]==c[x1[i]][x2[i]] && bfs(x2[i]) || f[x2[i]][x1[i]]==c[x2[i]][x1[i]] && bfs(x1[i]))
            out<<i<<'\n';
    return 0;
}