Cod sursa(job #2697722)

Utilizator cyg_SerbanBFlorin Gheorghe cyg_SerbanB Data 19 ianuarie 2021 13:49:15
Problema Critice Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
pair<int,int> much[10005];
int cost[1005][1005],floc[1005][1005],tata[1005],n,m;
bool viz[1005],viz2[2][1005];
vector<int> adc[1005];
inline void zero()
{
    for(int i=1;i<=1000;++i)
        viz[i]=0;
}
bool bfs()
{
    zero();
    queue<int> q;
    viz[1]=1;
    q.push(1);
    while(!q.empty())
    {
        int t=q.front();
        q.pop();
        for(int i=0;i<adc[t].size();++i)
            if(cost[t][adc[t][i]]!=floc[t][adc[t][i]] && !viz[adc[t][i]])
            {
                viz[adc[t][i]]=1;
                q.push(adc[t][i]);
                tata[adc[t][i]]=t;
                if(adc[t][i]==n)
                    return 1;
            }
    }
    return 0;
}
void altbfs(int st)
{
    int sm=1,ok=0;
    if(st==n)
        ok=1,sm=-1;
    queue<int>q;
    q.push(st);
    zero();
    viz2[ok][st]=viz[st]=1;
    while(!q.empty())
    {
        int t=q.front();
        q.pop();
        for(int i=0;i<adc[t].size();++i)
            if(!viz[adc[t][i]] && sm*floc[t][adc[t][i]]>0 && abs(floc[t][adc[t][i]])<cost[t][adc[t][i]])
            {
                q.push(adc[t][i]);
                viz2[ok][adc[t][i]]=viz[adc[t][i]]=1;
            }
    }
}
int main()
{
    freopen("critice.in","r",stdin);
    freopen("critice.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;++i)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        much[i].x=x;
        much[i].y=y;
        cost[x][y]+=z;
        cost[y][x]+=z;
        adc[x].push_back(y);
        adc[y].push_back(x);
    }
    while(bfs())
    {
        int mi=INT_MAX;
        for(int i=n;i!=1;i=tata[i])
            mi=min(mi,cost[tata[i]][i]-floc[tata[i]][i]);
        for(int i=n;i!=1;i=tata[i])
            floc[tata[i]][i]+=mi,floc[i][tata[i]]-=mi;
    }
    vector<int> ans;
    altbfs(1);
    altbfs(n);
    for(int i=1;i<=m;++i)
    {
        if(floc[much[i].x][much[i].y]<0)
            swap(much[i].x,much[i].y);
        if(cost[much[i].x][much[i].y]==floc[much[i].x][much[i].y])
            if((viz2[0][much[i].x] && viz2[1][much[i].y]))
                ans.push_back(i);
    }
    printf("%lu\n",ans.size());
    for(int i=0;i<ans.size();++i)
        printf("%d\n",ans[i]);
    return 0;
}