Cod sursa(job #2627460)

Utilizator loraclorac lorac lorac Data 10 iunie 2020 22:02:28
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.66 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream cin("critice.in");
ofstream cout("critice.out");
const int inf=1e9+7;
vector<int> vec[2005];
struct Op
{
    int nod;
    int edge;
    bool cost;
};
vector<Op> norm[1005];
int pred[2005];
int c[2005][2005];
bool viz[2][1005];
bool ok[10005];
queue<int> q;
int main()
{
    int n,m,a,b,cst;
    cin>>n>>m;
    for(int i=1;i<=m;++i)
    {
        cin>>a>>b>>cst;
        norm[a].push_back({b,i,0});
        norm[b].push_back({a,i,0});
        vec[a].push_back(b+n); vec[b+n].push_back(a);
        vec[b].push_back(a+n); vec[a+n].push_back(b);
        c[a][b+n]=cst;
        c[b][a+n]=cst;
    }
    for(int i=1;i<=n;++i)
    {
        vec[i].push_back(i+n); vec[i+n].push_back(i);
        c[i+n][i]=inf;
    }
    int ads;
    do
    {
        for(int i=2;i<=2*n;++i)
            pred[i]=0;
        pred[1]=-1;
        q.push(1);
        while(!q.empty())
        {
            int x=q.front();
            q.pop();
            for(auto t:vec[x])
            if(pred[t]==0 and c[x][t]>0)
            {
                pred[t]=x;
                q.push(t);
            }
        }
        if(pred[2*n])
        for(auto t:vec[2*n])
        if(pred[t])
        {
            ads=c[t][2*n];
            for(int k=t;pred[k]>0;k=pred[k])
                ads=min(ads,c[pred[k]][k]);
            if(c[t][2*n]!=inf)
            {
                c[t][2*n]-=ads;
                c[2*n][t]+=ads;
            }
            for(int k=t;pred[k]>0;k=pred[k])
            if(c[pred[k]][k]!=inf)
            {
                c[pred[k]][k]-=ads;
                c[k][pred[k]]+=ads;
            }
        }
    }while(pred[2*n]);
    for(int i=1;i<=n;++i)
    for(int j=0;j<norm[i].size();++j)
        norm[i][j].cost=(min(c[i][norm[i][j].nod+n],c[norm[i][j].nod][i+n])>0);
    q.push(1);
    viz[0][1]=1;
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        for(Op t:norm[x])
        if(t.cost==1 and viz[0][t.nod]==0)
        {
            viz[0][t.nod]=1;
            q.push(t.nod);
        }
    }
    q.push(n);
    viz[1][n]=1;
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        for(Op t:norm[x])
        if(t.cost==1 and viz[1][t.nod]==0)
        {
            viz[1][t.nod]=1;
            q.push(t.nod);
        }
    }
    for(int i=1;i<=n;++i)
    for(auto t:norm[i])
    if(viz[0][i] and viz[1][t.nod])
        ok[t.edge]=1;
    int tot=0;
    for(int i=1;i<=m;++i)
        tot+=ok[i];
    cout<<tot<<'\n';
    for(int i=1;i<=m;++i)
    if(ok[i]) cout<<i<<'\n';
    return 0;
}