Cod sursa(job #2245124)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 24 septembrie 2018 18:54:18
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <cstdio>
#include <bitset>
#include <vector>
#include <algorithm>
#define INF 2000000000
#define DIMN 1001
#define DIMM 10001
using namespace std;

bitset <DIMN> f;
short c[DIMN][DIMN],nr[DIMN][DIMN],fl[DIMN][DIMN],d[DIMN],tt[DIMN],vf[DIMN],w[DIMM];
vector <short> v[DIMN];
pair <short,short> sol[DIMM];
int ok,n;
int i,p,u,nod,vecin;
int bfs (int s){
    f.reset();
    ok=0;
    p=u=1;
    d[p]=s;
    f[s]=1;
    while (p<=u){
        nod=d[p];
        for (i=0;i<v[nod].size();i++){
            vecin=v[nod][i];
            if (f[vecin]==0 && fl[nod][vecin]+fl[vecin][nod]<c[nod][vecin]){
                f[vecin]=1;
                d[++u]=vecin;
                tt[vecin]=nod;
            }
            if (vecin==n && fl[nod][vecin]+fl[vecin][nod]<c[nod][vecin])
                vf[++ok]=nod;
        }
        p++;
    }
    return f[n];
}
int main()
{
    FILE *fin=fopen ("critice.in","r");
    FILE *fout=fopen ("critice.out","w");
    int m,i,x,y,cap,s,nod,vecin,st,mini,ns,vs;
    fscanf (fin,"%d%d",&n,&m);
    for (i=1;i<=m;i++){
        fscanf (fin,"%d%d%d",&x,&y,&cap);
        c[x][y]=c[y][x]=cap;
        nr[x][y]=nr[y][x]=i;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    s=0;
    while (bfs(1)){
        for (i=1;i<=ok;i++){
            nod=vf[i];
            vecin=n;
            mini=INF;
            st=1;
            while (nod!=0){
                if (mini>c[nod][vecin]-fl[nod][vecin]-fl[vecin][nod]){
                    mini=c[nod][vecin]-fl[nod][vecin]-fl[vecin][nod];
                    ns=nod;
                    vs=vecin;
                    st=1;
                }
                else if (mini==c[nod][vecin]-fl[nod][vecin]-fl[vecin][nod])
                    st=0;
                vecin=nod;
                nod=tt[nod];
            }
            if (st)
                sol[++s]=make_pair(ns,vs);
            nod=vf[i];
            vecin=n;
            while (nod!=0){
                fl[nod][vecin]+=mini;
                vecin=nod;
                nod=tt[nod];
            }
        }
    }
    int s2=0;
    for (i=1;i<=s;i++){
        c[sol[i].first][sol[i].second]++;
        c[sol[i].second][sol[i].first]++;
        if (bfs(1))
            w[++s2]=nr[sol[i].first][sol[i].second];
        c[sol[i].first][sol[i].second]--;
        c[sol[i].second][sol[i].first]--;
    }
    s=s2;
    sort (w+1,w+s+1);
    fprintf (fout,"%d\n",s);
    for (i=1;i<=s;i++)
        fprintf (fout,"%d\n",w[i]);
    return 0;
}