Cod sursa(job #2661490)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 22 octombrie 2020 09:42:51
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <cstdio>
#include <bitset>
#include <vector>
#include <algorithm>
#define INF 2000000000
#define DIMN 1010
#define DIMM 10010
using namespace std;

bitset <DIMN> f;
int c[DIMN][DIMN],fl[DIMN][DIMN],d[DIMN],tt[DIMN],vf[DIMN],sol[DIMM];
vector <int> v[DIMN];
pair <int,int> fnr[DIMM];
int nr[2][DIMN];
int ok,n;
int bfs (int s){
    int i,p,u,nod,vecin;
    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]<c[nod][vecin]){
                f[vecin]=1;
                d[++u]=vecin;
                tt[vecin]=nod;
            }
            if (vecin==n && fl[nod][vecin]<c[nod][vecin])
                vf[++ok]=nod;
        }
        p++;
    }
    return f[n];
}


void bfs2 (int s,int caz){
    int i,p,u,nod,vecin;
    f.reset();
    p=u=1;
    d[p]=s;
    f[s]=1;
    while (p<=u){
        nod=d[p];
        nr[caz][nod]=1;
        for (i=0;i<v[nod].size();i++){
            vecin=v[nod][i];
            if (f[vecin]==0 && max(fl[nod][vecin],-fl[nod][vecin])<c[nod][vecin]){
                f[vecin]=1;
                d[++u]=vecin;
            }
        }
        p++;
    }
}
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;
        fnr[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]);
                vecin=nod;
                nod=tt[nod];
            }
            nod=vf[i];
            vecin=n;
            while (nod!=0){
                fl[nod][vecin]+=mini;
                fl[vecin][nod]-=mini;
                vecin=nod;
                nod=tt[nod];
            }
        }
    }
    bfs2(1,0);
    bfs2(n,1);
    for (i=1;i<=m;i++){
        x=fnr[i].first;
        y=fnr[i].second;
        if (nr[0][x]+nr[1][y]==2 || nr[0][y]+nr[1][x]==2)
            sol[++s]=i;
    }
    fprintf (fout,"%d\n",s);
    for (i=1;i<=s;i++)
        fprintf (fout,"%d\n",sol[i]);
    return 0;
}