Cod sursa(job #447295)

Utilizator Bogdan_CCebere Bogdan Bogdan_C Data 28 aprilie 2010 12:42:25
Problema Critice Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.02 kb
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define FIN "critice.in"
#define FOUT "critice.out"
#define NMAX 1001
#define MMAX 12003
#define INF 0x3f3f3f3f
#include<vector>

vector < pair<int,int> > G[NMAX];
int coada[NMAX],viz[NMAX],N,M,RT[NMAX],F[NMAX][NMAX],C[NMAX][NMAX],marcare[MMAX];

int BF()
{
    memset(viz,0,sizeof(viz));
    int p,q;
    coada[p = q = 1] = 1;
    viz[1]=1;
    while(p<=q)
     {
            int nod = coada[p++];
            if(nod == N) continue;
            vector< pair<int,int> >::iterator it;
            for( it = G[nod].begin() ; it!=G[nod].end(); it++ )
             {
                if( viz[it->first] || F[nod][it->first]==C[nod][it->first] ) continue;
                viz[it->first] = 1;
                RT[it->first] = nod;
                coada[++q] = it->first;    
                    }
            }
       return viz[ N ];
    } 
    
 void  critice(int s,int mr)
 {      int p,q;
        memset(viz,0,sizeof(viz));
        coada[p=q=1]=s;
        viz[s]=1;
        while(p<=q)
         {
                int nod = coada[p++];
                vector<pair<int,int> >::iterator it;
                for(it = G[nod].begin(); it!=G[nod].end();it++)
                  if(viz[it->first] == 0 )
                     if((mr==1 && C[nod][it->first]==F[nod][it->first]) || (mr==2 && C[it->first][nod]==F[it->first][nod]))
                          marcare[it->second] |= mr;     
                     else coada[++q] = it->first , viz[it->first] =1;  
            }
        
}   
    
int main()
{
    freopen(FIN,"r",stdin);
    freopen(FOUT,"w",stdout);
    
    scanf("%d %d",&N,&M);
    for(int i=1;i<=M;i++)
     {
            int x,y,c;
            scanf("%d %d %d",&x,&y,&c);
            G[x].push_back(make_pair(y,i));
            G[y].push_back(make_pair(x,i));
            C[x][y]=c;
            }
      int flux,fmin;      
     for(flux = 0;BF() ; )
      {
            vector<pair<int,int> > ::iterator it;
            for( it = G[N].begin(); it != G[N].end(); it++)
             {
                    int nod = it->first;
                    if( F[nod][N]==C[nod][N] || !viz[nod] ) continue;
                    RT[N]=nod;
                    fmin=INF;
                    for(nod = N ;nod!=1 ; nod=RT[nod])
                      {
                            fmin=min(fmin, C[RT[nod]][nod] - F[RT[nod]][nod] );
                            }
                     if(fmin == 0) continue;
                    for(nod = N ;nod!=1 ; nod=RT[nod])
                      {
                            F[RT[nod]][nod] +=fmin;
                            F[nod][RT[nod]] -= fmin;
                            }
                            
                    flux+=fmin;
                    }
            
            }      
    critice(1,1);
    critice(N,2);
    int nr=0;
    for(int i=1;i<=M;i++) if(marcare[i]==3) nr++;
    printf("%d\n",nr); 
    for(int i=1;i<=M;i++) if(marcare[i]==3) printf("%d\n",i);    
    return 0;
    }