Cod sursa(job #134559)

Utilizator cos_minBondane Cosmin cos_min Data 11 februarie 2008 21:11:37
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.22 kb
#include <fstream>
#include <stdio.h>
#include <string.h>
using namespace std;

#define in "critice.in"
#define out "critice.out"
#define Dim 1002

int c[Dim][Dim], sel[Dim], sel2[Dim], t[10002], q[Dim], s[Dim][Dim];
long f[Dim][Dim], cr[Dim];
int n, m, S, T;
int flow, p;
int q1[10001], q2[10001];

void Read();
int FindPath();
void Augment();
void MaxFlow();
void Solve();
void DF(int nod);

int Minim(int a,int b)
{
    if ( a > b ) return b;
    return a;
}    

int main()
{
    Read();
    MaxFlow();
    
    return 0;
}

void DF(int nod)
{
    sel[nod] = 1;
    
    for ( int i = 1; i <= n; i++ )
    {
        if ( !sel[i] && s[nod][i] == 1 ) 
        {
              if ( c[nod][i] != f[nod][i] && c[nod][i] != f[i][nod] ) 
              {
                  DF(i);
              }    
        }    
    }
}        
        
void Read()
{
    int x,y,val;
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    scanf("%d%d",&n,&m);
    for ( int i = 1; i <= m; i++ )
    {
        scanf("%d%d%d",&x,&y,&val);
        q1[i] = x;
        q2[i] = y;
        s[x][y] = s[y][x] = 1;
        c[x][y] = c[y][x] = val;
    }
    S = 1;
    T = n;
}

void MaxFlow()
{
    int k = 0;
    
    while ( FindPath() ) 
    {
        Augment();
    }
    
    for ( int i = 1; i <= n; i++ )
    {
        sel[i] = 0;
    }    
        
    p = 0;
    DF(1);
    
    for ( int i = 1; i <= n; i++ )
    {
        sel2[i] = sel[i];
        sel[i] = 0;
    }    
    
    p = 0;
    DF(n);
    
    for ( int i = 1; i <= m; i++ )
    {
        if ( c[q1[i]][q2[i]] == f[q1[i]][q2[i]] || c[q1[i]][q2[i]] == f[q2[i]][q1[i]] )
        {
            if ( (sel[q1[i]] == 1 && sel2[q2[i]] == 1) || (sel2[q1[i]] == 1 && sel[q2[i]] == 1)) 
            {
                k+=1;
                t[k] = i;
            }    
        }
    }  
    printf("%d\n",k);
    for ( int i = 1; i <= k; i++ ) printf("%d\n",t[i]);      
    
}

int FindPath()
{
    int u,p,i,j;
    for ( i = 1; i <= n; i++ )
        sel[i] = t[i] = q[i] = cr[i] = 0;
        
    sel[1] = 1;
    t[1] = 0;
    u = p = 1;
    q[u] = 1;
    cr[1] = 100001;
    
    while ( p <= u )
    {
        i = q[p];
        for ( j = 1; j <= n; j++ )
        {
            if ( !sel[j] )
            {
                if ( c[i][j] > f[i][j] )
                {
                    cr[j] = Minim(c[i][j]-f[i][j],cr[i]);  
                    q[++u] = j;
                    sel[j] = 1;
                    t[j] = i;
                    if ( j == n ) return 1;
                }
                if ( f[j][i] > 0 )
                {
                    cr[j] = Minim(f[j][i],cr[i]);
                    q[++u] = j;
                    sel[j] = 1;
                    t[j] = -i;
                    if ( j == n ) return 1;
                }
            }
        }
        p++;
    } 
    return 0;
}

void Augment()
{
    int i, j;
    j = n;
    while ( j != S )
    {
        i = abs(t[j]);
        if ( t[j] >= 0 ) f[i][j]+=cr[T];
        else             f[j][i]-=cr[T];
        j = i;
    }
  //  flow+=cr[n];
}