Cod sursa(job #2245113)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 24 septembrie 2018 18:44:58
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 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],fl[DIMN][DIMN],d[DIMN],tt[DIMN],vf[DIMN],sol[DIMN];
vector <short> v[DIMN];
pair <short,short> nr[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,mini;
    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[i]=make_pair(x,y);
        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;
            while (nod!=0){
                mini=min(mini,c[nod][vecin]-fl[nod][vecin]-fl[vecin][nod]);
                vecin=nod;
                nod=tt[nod];
            }
            nod=vf[i];
            vecin=n;
            while (nod!=0){
                fl[nod][vecin]+=mini;
                vecin=nod;
                nod=tt[nod];
            }
        }
    }
    for (i=1;i<=m;i++){
        x=nr[i].first;
        y=nr[i].second;
        if (fl[x][y]+fl[y][x]==c[x][y]){
            c[x][y]++;
            c[y][x]++;
            if (bfs(1))
                sol[++s]=i;
            c[x][y]--;
            c[y][x]--;
        }
    }
    fprintf (fout,"%d\n",s);
    for (i=1;i<=s;i++)
        fprintf (fout,"%d\n",sol[i]);
    return 0;
}