Cod sursa(job #2665314)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 30 octombrie 2020 15:42:47
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
const int NMAX = 1005;
const int INF = (1<<29);
int f[NMAX][NMAX],c[NMAX][NMAX],tata[NMAX];
int n,m,x,y,z,rasp[10005];
bool ver[NMAX],ver2[NMAX];
pair<int,int> muchie[10005];
vector <int> v[NMAX];
queue <int> q;
bool bfs(){
    for(int i=1;i<=n;i++) ver[i]=false;
    ver[1]=true;
    q.push(1);
    while(!q.empty()){
        int node=q.front();
        q.pop();
        for(int i=0;i<v[node].size();i++){
            int vecin=v[node][i];
            if(ver[vecin]==false and c[node][vecin]>f[node][vecin]){
                q.push(vecin);
                tata[vecin]=node;
                ver[vecin]=true;
            }
        }
    }
    if(ver[n]==true) return 1;
    return 0;
}
int main()
{
    fin >> n >> m;
    for(int i=1;i<=m;i++){
        fin >> x >> y >> z;
        muchie[i]={x,y};
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y]=z;
        c[y][x]=z;
    }
    while(bfs()==true){
        for(int i=0;i<v[n].size();i++){
            int nod=v[n][i];
            if(ver[nod]==true and c[nod][n]>f[nod][n]){
                int minim=c[nod][n]-f[nod][n];
                int aux=nod;
                while(aux!=1){
                    int t=tata[aux];
                    if(c[t][aux]-f[t][aux]<minim)
                        minim=c[t][aux]-f[t][aux];
                    aux=tata[aux];
                }
                if(minim==0) continue;
                f[nod][n]+=minim;
                f[n][nod]-=minim;
                aux=nod;
                while(aux!=1){
                    int t=tata[aux];
                    f[t][aux]+=minim;
                    f[aux][t]-=minim;
                    aux=tata[aux];
                }
            }
        }
    }
    for(int i=1;i<=n;i++) ver2[i]=false;
    ver2[n]=true;
    q.push(n);
    while(!q.empty()){
        int node=q.front();
        q.pop();
        for(int i=0;i<v[node].size();i++){
            int vecin=v[node][i];
            if(ver2[vecin]==false and c[node][vecin]>-f[node][vecin]){
                q.push(vecin);
                tata[vecin]=node;
                ver2[vecin]=true;
            }
        }
    }
    int dim_rasp=0;
    for(int i=1;i<=m;i++){
        if((ver[muchie[i].first]==true and ver2[muchie[i].second]==true) or (ver2[muchie[i].first]==true and ver[muchie[i].second]==true))
            rasp[++dim_rasp]=i;
    }
    fout << dim_rasp << '\n';
    for(int i=1;i<=dim_rasp;i++)
        fout << rasp[i] << '\n';
    return 0;
}