Cod sursa(job #2327521)

Utilizator MAXIMILLIANMUSOHYEAHYEAH MAXIMILLIANMUS Data 24 ianuarie 2019 19:19:38
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <bits/stdc++.h>
 
using namespace std;
 
ifstream f("critice.in");
ofstream g("critice.out");
 
int n,m,x,X[10010],Y[10010],c,i,t[1010],T[1010],cap[1010][1010],flux[1010][1010];
vector<int> ans,v[1010];
queue<int> Q;
 
bool BFS()
{
    t[1]=-1;
    for(i=2;i<=n;i++)t[i]=0;
    Q.push(1);
    while(Q.size())
    {
        x=Q.front();Q.pop();
        for(auto it:v[x])
        {
            if(t[it]>0||it==1)
                continue;
            if(flux[x][it]==cap[x][it])continue;
            t[it]=x;
            Q.push(it);
        }
    }
    if(!t[n])
        return 0;
    return 1;
}
 
void UPD()
{
    int j,FC;
    for(auto i:v[n])
        if(t[i]&&cap[i][n]>flux[i][n])
        {
            FC=cap[i][n]-flux[i][n];
            for(j=i; j!=1; j=t[j])
                FC=min(FC,cap[t[j]][j]-flux[t[j]][j]);
            if(FC)
            {
                flux[i][n]+=FC;
                flux[n][i]-=FC;
                for(j=i; j!=1; j=t[j])
                {
                    flux[t[j]][j]+=FC;
                    flux[j][t[j]]-=FC;
                }
            }
        }
}
 
int main()
{
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>X[i]>>Y[i]>>c;
        cap[X[i]][Y[i]]=c;
        cap[Y[i]][X[i]]=c;
        v[X[i]].push_back(Y[i]);
        v[Y[i]].push_back(X[i]);
    }
    while(BFS())UPD();
//    for(i=1;i<=m;i++)
//        g<<X[i]<<' '<<Y[i]<<' '<<flux[X[i]][Y[i]]<<':'<<cap[X[i]][Y[i]]<<'\n';
    BFS();
    T[n]=-1;
    for(i=1;i<n;i++)T[i]=0;
    Q.push(n);
    while(Q.size())
    {
        x=Q.front();Q.pop();
        for(auto it:v[x])
        {
            if(T[it]>0||it==n)
                continue;
            if(flux[it][x]==cap[it][x])continue;
            T[it]=x;
            Q.push(it);
        }
    }
//    for(i=1;i<=n;i++)
//        cout<<t[i]<<' ';cout<<'\n';
//    for(i=1;i<=n;i++)
//        cout<<T[i]<<' ';cout<<'\n';
//    for(i=1;i<=n;i++)
//        cout<<X[i]<<' '<<Y[i]<<' '<<flux[X[i]][Y[i]]<<':'<<cap[X[i]][Y[i]]<<' '<<flux[Y[i]][X[i]]<<':'<<cap[Y[i]][X[i]]<<'\n';
    for(i=1;i<=m;i++)
        if((t[X[i]]&&T[Y[i]]&&cap[X[i]][Y[i]]==flux[X[i]][Y[i]])||(T[X[i]]&&t[Y[i]]&&cap[Y[i]][X[i]]==flux[Y[i]][X[i]]))
            ans.push_back(i);
    g<<ans.size()<<'\n';
    for(auto it:ans)
        g<<it<<'\n';
    return 0;
}