Cod sursa(job #1677354)

Utilizator alex.vasiuVasiu Alexandru alex.vasiu Data 6 aprilie 2016 15:25:49
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
const int NMAX = 1002;
vector<int> G[NMAX],T;
int F[NMAX][NMAX],C[NMAX][NMAX];
int m,n;
bool BF()
{
    T=vector<int>(n+1,0);
    queue<int> q;
    q.push(1);
    T[1]=-1;
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        for(auto x:G[u])
            if(!T[x] && C[u][x]>F[u][x])
        {
            T[x]=u;
            q.push(x);
            if(x==n)
                return true;
        }
    }
    return false;
}
int main()
{
    f>>n>>m;
    int flux = 0;
    vector<pair<int,int>>edges;
    vector<int> rez;
    while(m--)
    {
        int a,b;
        f>>a>>b;
        f>>C[a][b];
        edges.push_back({a,b});
        G[a].push_back(b);
        G[b].push_back(a);
    }
    while(BF())
        for(auto x:G[n])
        {
        if(T[x]==-1 || C[x][n]<=F[x][n])
            continue;
        int r = C[x][n]-F[x][n];
        for(int j = x;j>1;j=T[j])
            r=min(r,C[T[j]][j]-F[T[j]][j]);
        if(!r)
            continue;
        F[x][n]+=r;
        F[n][x]-=r;
        for(int j=x;j>1;j=T[j])
            F[T[j]][j]+=r,F[T[j]][j]-=r;
        flux+=r;
        }
    int r1=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++)
        if(C[i][j] || C[i][j]<F[i][j])
             r1++,rez.push_back(find(begin(edges),end(edges),make_pair(i,j))-begin(edges));
   g<<r1<<"\n";
   for(auto x:rez)
    g<<x+1<<"\n";
}