Cod sursa(job #1068045)

Utilizator andreiiiiPopa Andrei andreiiii Data 27 decembrie 2013 20:49:51
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <algorithm>
#include <fstream>
#include <bitset>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
#define PII pair<int, int>
#define x first
#define y second

using namespace std;

const int N=1003;

ifstream fin("critice.in");
ofstream fout("critice.out");

vector <int> g[N], sol;
bitset <N> v, v1;
PII mc[N*10];
int C[N][N], F[N][N], Tr[N];
int n, m, flow;

int bfs()
{
    int x;
    queue <int> Q;
    v.reset();
    v[1]=1;
    Q.push(1);
    for(;!Q.empty();Q.pop())
    {
        x=Q.front();
        if(x==n) continue;
        for(auto p: g[x])
        {
            if(C[x][p]==F[x][p]||v[p]) continue;
            v[p]=1;
            Tr[p]=x;
            Q.push(p);
        }
    }
    return v[n];
}

void dfs1(int x)
{
    v[x]=1;
    for(auto p: g[x])
    {
        if(!v[p]&&C[x][p]>F[x][p]) dfs1(p);
    }
}

void dfs2(int x)
{
    v1[x]=1;
    for(auto p: g[x])
    {
        if(!v1[p]&&C[p][x]>F[p][x]) dfs2(p);
    }
}

void get_flow()
{
    int i, fmin;
    while(bfs())
    {
        for(auto p: g[n])
        {
            if(C[p][n]==F[p][n]||!v[p]) continue;
            Tr[n]=p;
            fmin=INF;
            for(i=n;i!=1;i=Tr[i])
            {
                fmin=min(fmin, C[Tr[i]][i]-F[Tr[i]][i]);
            }
            if(!fmin) continue;
            for(i=n;i!=1;i=Tr[i])
            {
                F[Tr[i]][i]+=fmin;
                F[i][Tr[i]]-=fmin;
            }
            flow+=fmin;
        }
    }
    v.reset();
}

int main()
{
    int i;
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>mc[i].x>>mc[i].y;
        g[mc[i].x].push_back(mc[i].y);
        g[mc[i].y].push_back(mc[i].x);
        fin>>C[mc[i].x][mc[i].y];
        C[mc[i].y][mc[i].x]=C[mc[i].x][mc[i].y];
    }
    get_flow();
    dfs1(1);
    dfs2(n);
    for(i=1;i<=m;i++)
    {
        if(v[mc[i].x]&&v1[mc[i].y]&&F[mc[i].x][mc[i].y]==C[mc[i].x][mc[i].y]) sol.push_back(i);
        else if(v1[mc[i].x]&&v[mc[i].y]&&F[mc[i].y][mc[i].x]==C[mc[i].x][mc[i].y]) sol.push_back(i);
    }
    fout<<sol.size()<<"\n";
    for(auto p: sol) fout<<p<<"\n";
    //fout<<F[2][1]<<" "<<F[1][2]<<" "<<C[2][1];
    fin.close();
    fout.close();
}