Cod sursa(job #1405618)

Utilizator bogdanboboc97Bogdan Boboc bogdanboboc97 Data 29 martie 2015 14:25:13
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <fstream>
#include <limits>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstdlib>
#define INF numeric_limits<int>::max()
#define pb push_back
#define mp make_pair
using namespace std;
ifstream in("critice.in");
ofstream out("critice.out");
vector< vector<int> > a;
vector< pair<int,int> > edge;
vector<int> sol;
queue<int> q;
int cap[1002][1002],flow[1002][1002],n,m,pre[1002],t[1002],k,s,d;
//.......................
bool bfs()
{
    k=0;
    q.push(s);
    for(int i=1;i<=n;i++)pre[i]=0;
    pre[s]=s;
    while(!q.empty())
    {
        int x=q.front();q.pop();
        for(vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
            if(cap[x][*i]-flow[x][*i]>0 && pre[*i]==0)
            {
                if(*i==d)
                {
                    t[++k]=x;
                    continue;
                }
                pre[*i]=x;
                q.push(*i);
            }
    }
    return k;
}
//.................
bool ap1[1002],ap2[1002];
void bf(int x,bool v[])
{
    v[x]=true;
    q.push(x);
    while(!q.empty())
    {
        int x=q.front();q.pop();
        for(vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
        if(v[*i]==false && abs(flow[x][*i])!=cap[x][*i])
        {
            v[*i]=true;
            q.push(*i);
        }
    }
}
//.........................
int main()
{
    in>>n>>m;
    a=vector< vector<int> > (n+1);
    edge=vector< pair<int,int> > (m+1);
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        in>>x>>y>>z;
        a[x].pb(y);
        a[y].pb(x);
        cap[x][y]=cap[y][x]=z;
        edge[i]=mp(x,y);
    }
    //.....................
    for(s=1,d=n;bfs();)
    {
        for(int i=1;i<=k;i++)
        {
            int mx=INF;
            pre[d]=t[i];
            //.................
            for(int x=d;x!=pre[x];x=pre[x])
                mx=min(cap[pre[x]][x]-flow[pre[x]][x],mx);
            //..................
            for(int x=d;x!=pre[x];x=pre[x])
            {
                flow[pre[x]][x]+=mx;
                flow[x][pre[x]]-=mx;
            }
        }
    }
    //.....................
    bf(s,ap1);
    bf(d,ap2);
    for(int i=1;i<=m;i++)
        if( (ap1[edge[i].first] && ap2[edge[i].second]) || (ap2[edge[i].first] && ap1[edge[i].second]) )
        sol.pb(i);
    //.....................
    out<<sol.size()<<'\n';
    for(vector<int>::iterator i=sol.begin();i!=sol.end();i++)
        out<<*i<<'\n';
    return 0;
}