Cod sursa(job #1145493)

Utilizator kiralalaChitoraga Dumitru kiralala Data 18 martie 2014 11:15:42
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
using namespace std;

#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(V) for(vector<int>::iterator it = (V).begin(); it < (V).end(); ++it)

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 sol[MMAX];

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(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(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(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);
    int cnt=0;
    for(int i=0;i<m;++i)
    {
        if(color[edg[i].a]!=color[edg[i].b])
            sol[cnt++]=(i+1);
    }
    printf("%d\n",cnt);
    for(int i=0;i<cnt;++i)
        printf("%d\n",sol[i]);
    return 0;
}