Cod sursa(job #1145362)

Utilizator kiralalaChitoraga Dumitru kiralala Data 18 martie 2014 10:09:30
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <fstream>
#include <utility>
#include <vector>
#include <typeinfo>
#include <queue>
#include <cstring>
#define a first
#define b second
#define pb push_back
#define mp make_pair
#define NMAX 1005
#define MMAX 10005
#define INF 999999999
#define foreach(it,V) for(typeof((V).begin()) it = (V).begin(); it < (V).end(); ++(it))

using namespace std;

typedef pair<int,int> Edge;
FILE* f=freopen("critice.in","r",stdin);
FILE* o=freopen("critice.out","w",stdout);

int n,m;
vector<int> G[NMAX];
Edge edg[MMAX];
int cap[NMAX][NMAX];
int flw[NMAX][NMAX];
int father[NMAX];

int BFS()
{
    queue<int> q;
    memset(father,0,sizeof(father));
    q.push(1);
    father[1]=-1;
    while(!q.empty())
    {
        int where=q.front();
        q.pop();
        if(where==n) continue;
        foreach(it,G[where])
        {
            if(cap[where][*it]==flw[where][*it]||father[*it]) continue;
            father[*it]=where;
            q.push(*it);
        }
    }
    return father[n];
}
inline int minim(int a,int b) { return (a<b)?a:b; }
void MaxFlow()
{
    while(BFS())
    {
        int node;
        foreach(it,G[n])
        {
            if(cap[*it][n]==flw[*it][n]||!father[*it]) continue;
            int minflow=INF;
            for(node=n;node!=1;node=father[node])
            {
                int ft=father[node];
                minflow=minim(minflow,cap[ft][node]-flw[ft][node]);
            }
            if(!minflow) continue;
            for(node=n;node!=1;node=father[node])
            {
                int ft=father[node];
                flw[ft][node]+=minflow;
                flw[node][ft]-=minflow;
            }
        }
    }
}
bool color[NMAX];
void ApplyColor(int x)
{
    color[x]=1;
    foreach(it,G[x])
    {
        if(!color[*it]&&cap[x][*it]!=flw[x][*it])
            ApplyColor(*it);
    }
}

int main()
{
    scanf("%d%d",&n,&m);

    for(int i=0;i<m;++i)
    {
        int x,y,c;
        scanf("%d%d%d",&x,&y,&c);
        G[x].pb(y);
        G[y].pb(x);
        cap[x][y]=cap[y][x]=c;
        edg[i]=mp(x,y);
    }

    MaxFlow();

    ApplyColor(1);

    vector<int> sol;
    for(int i=0;i<m;++i)
    {
        if(color[edg[i].a]!=color[edg[i].b])
            sol.pb(i+1);
    }
    printf("%d\n",sol.size());
    foreach(it,sol)
        printf("%d\n",*it);
    return 0;
}