Cod sursa(job #921489)

Utilizator Marius96Marius Gavrilescu Marius96 Data 21 martie 2013 00:34:57
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<cstdio>
#include<cstdlib>
#include<cstring>
 
#include<vector>
#include<set>
#include<queue>
#define min(a,b) ((a)<(b)?(a):(b))
 
static bool a[1005],b[1005];
static int c[1005][1005], f[1005][1005], parent[1005];
static int seen[1005], seenc;
static int n;
static std::vector<int> v[1005];
static struct
{
    int x,y;
}e[10005];
 
bool bfs(void)
{
    std::queue<int> q;
    q.push (1);
    seen[1]=++seenc;
 
    while(!q.empty()){
        int n=q.front();
        q.pop();
        for(std::vector<int>::iterator it=v[n].begin();it!=v[n].end();it++)
            if(c[n][*it] != f[n][*it] && seen[*it]<seenc){
                seen[*it]=seenc;
                q.push (*it);
                parent[*it]=n;
                if(*it==::n)
                    return 1;
            }
    }
 
    return 0;
}
 
void dfs (int i, bool *s)
{
    s[i]=1;
    for(std::vector<int>::iterator it=v[i].begin();it!=v[i].end();it++)
        if(c[i][*it] != abs (f[i][*it]) && !s[*it])
            dfs (*it,s);
}
 
int main (void)
{
    freopen ("critice.in","r",stdin);
#ifdef INFOARENA
    freopen ("critice.out","w",stdout);
#endif
 
    int m;
    scanf ("%d%d",&n,&m);
 
    for(int i=0;i<m;i++){
        int z;
        scanf ("%d%d%d",&e[i].x,&e[i].y,&z);
        if(z==0)
            continue;
        c[e[i].x][e[i].y]=c[e[i].y][e[i].x]=z;
        v[e[i].x].push_back (e[i].y);
        v[e[i].y].push_back (e[i].x);
    }
 
    while(bfs()){
        int fmin=0x3F3F3F;
        for(int i=n;i>1;i=parent[i])
            fmin=min (fmin, c[parent[i]][i] - f[parent[i]][i]);
        for(int i=n;i>1;i=parent[i])
            f[parent[i]][i]+=fmin, f[i][parent[i]]-=fmin;
    }
 
    dfs (1, a);
    dfs (n, b);
 
    std::vector<int> r;
    for(int i=0;i<m;i++)
        if(abs (f[e[i].x][e[i].y]) == c[e[i].x][e[i].y] && ((a[e[i].x] && b[e[i].y]) || (a[e[i].y] && b[e[i].x])))
                r.push_back (i+1);
 
    printf ("%lu\n",r.size());
    for(unsigned i=0;i<r.size();i++)
        printf ("%d\n",r[i]);
    return 0;
}