Cod sursa(job #2885464)

Utilizator popescuadrianpopescuadrian popescuadrian Data 6 aprilie 2022 02:09:20
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.13 kb
#include <fstream>
#include <queue>

using namespace std;
ifstream cin("critice.in");
ofstream cout("critice.out");
queue<int>qu;
int fre[10005];
int par[10005];
int suma[10005];
int cap[1005][1005];
int flux[1005][1005];
vector<int>adj[1005];
int n;
int bfs()
{
    int curr=1,i,k;
    qu.push(curr);
    fre[1]=1;
    while(qu.size())
    {
        curr=qu.front();
        qu.pop();
        if(curr!=n)
        {
            for(i=0; i<adj[curr].size(); i++)
            {
                k=adj[curr][i];
                if(fre[k]==0 && flux[curr][k]!=cap[curr][k])
                {
                    fre[k]=1;
                    par[k]=curr;
                    qu.push(k);
                }
            }
        }
    }
    if(fre[n]==1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
void bfs (int x)
{
    int i,curr,k,val=0;
    for(i=1;i<=n;i++)
    {
        fre[i]=0;
    }
    if(x==1)
    {
        val=1;
    }
    else
    {
        val=2;
    }
    fre[x]=1;
    suma[x]=val;
    qu.push(x);
    while(qu.size())
    {
        curr=qu.front();
        qu.pop();
        for(i=0;i<adj[curr].size();i++)
        {
            k=adj[curr][i];
            if(fre[k]==0 && flux[curr][k]!=cap[curr][k] && flux[k][curr]!=cap[k][curr])
            {
                suma[k]+=val;
                qu.push(k);
                fre[k]=1;
            }
        }
    }
}
int x[100005];
int y[100005];
int main()
{
    int i,k,m,a,b,w,flow,pos,curr,fluximus=0;
    cin>>n>>m;
    for(i=1; i<=m; i++)
    {
        cin>>a>>b>>w;
        cap[a][b]=+w;
        cap[b][a]=+w;
        adj[a].push_back(b);
        adj[b].push_back(a);
        x[i]=a;
        y[i]=b;
    }
    pos=bfs();
    while(pos==1)
    {
        for(i=0; i<adj[n].size(); i++)
        {
            k=adj[n][i];
            par[n]=k;
            if(flux[k][n]!=cap[k][n] && fre[k]==1)
            {
                curr=n;
                flow=1e7;
                while(curr!=1)
                {
                    flow=min(flow,cap[par[curr]][curr]-flux[par[curr]][curr]);
                    curr=par[curr];
                }
                curr=n;
                if(flow!=0)
                {
                    while(curr!=1)
                    {
                        flux[par[curr]][curr]+=flow;
                        flux[curr][par[curr]]-=flow;
                        curr=par[curr];
                    }
                    fluximus+=flow;
                }
            }
        }
        for(i=1; i<=n; i++)
        {
            fre[i]=0;
        }
        pos=bfs();
    }
    bfs(1);
    bfs(n);
    int cnt=0;
    vector<int>vec;
    for(i=1; i<=m; i++)
    {
        a=x[i];
        b=y[i];
        if(suma[a]==1 && suma[b]==2)
        {
            cnt++;
            vec.push_back(i);
        }
        else if(suma[b]==1 && suma[a]==2)
        {
            cnt++;
            vec.push_back(i);
        }
    }
    cout<<cnt<<'\n';
    for(i=0;i<vec.size();i++)
    {
        cout<<vec[i]<<'\n';
    }
    return 0;
}