Cod sursa(job #340389)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 14 august 2009 14:53:12
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.1 kb
#include <cstdio>   
#include <cstring>   
#include <algorithm>   
#include <vector>   
#include <queue>   

using namespace std;   

#define file_in "critice.in"
#define file_out "critice.out"

#define Nmax 1005
#define pb push_back   

struct muchie   
{   
    int x,y;   
}m[Nmax*20];   
int G[Nmax][Nmax],gr[Nmax],c[Nmax][Nmax],n,mm,t[Nmax],f[Nmax][Nmax];   
int viz1[Nmax],vizn[Nmax];  
int viz[Nmax];

  

bool flux()   
{   
	int i;
    memset(t,0,sizeof(t));   
    memset(viz,0,sizeof(viz));
    
	viz[1]=1;   
    
	queue<int> Q;   
      
	int nod,nod1;   
    t[1]=-1;   
    
	for(Q.push(1);!Q.empty();Q.pop())   
    {   
        nod=Q.front();   
        for(i=1;i<=gr[nod];++i)   
        {   
            nod1=G[nod][i];   
            if(!viz[nod1] && c[nod][nod1]>f[nod][nod1])   
            {   
                t[nod1]=nod;   
                viz[nod1]=1;   
                if(nod1==n)   
                    return true;   
                Q.push(nod1);   
            }   
        }   
    }   
    return false;   
}   


void bfs1()   
{   
	int i,nod,nod1;
    queue<int> Q;   
  
    viz1[1]=1;
	
    for(Q.push(1);!Q.empty();Q.pop())   
    {   
        nod=Q.front();   
        for(i=1;i<=gr[nod];++i)   
        {   
            nod1=G[nod][i];   
            if(!viz1[nod1] && c[nod][nod1]>abs(f[nod][nod1]))   
            {   
                viz1[nod1]=1;   
                Q.push(nod1);   
            }   
        }   
    }   
}   


void bfsn()   
{ 
	int i,nod,nod1;
    
	queue<int> Q;   
  	
    vizn[n]=1;   
	
    for(Q.push(n);!Q.empty();Q.pop())   
    {   
        nod=Q.front();   
        for(i=1;i<=gr[nod];++i)   
        {   
            nod1=G[nod][i];   
            if(!vizn[nod1] && c[nod][nod1]>abs(f[nod][nod1]))   
            {   
                vizn[nod1]=1;   
                Q.push(nod1);   
            }   
        }   
    }   
}   


int main()   
{   
	int i;
    freopen(file_in,"r",stdin);   
    freopen(file_out,"w",stdout);   
    
    scanf("%d %d" ,&n,&mm);   
    int x,y,z;   
    for(i=1;i<=mm;++i)   
    {   
        scanf("%d %d %d",&x,&y,&z);   
        G[y][++gr[y]]=x;   
        G[x][++gr[x]]=y;
		m[i].x=x;
		m[i].y=y;
        c[x][y]=c[y][x]=z;   
    }   
	
    while(flux())   
    {   
        int v=0x3f3f3f3f,i=n;   
        
		while(i!=1)   
        {   
            v=min(v,c[t[i]][i]-f[t[i]][i]);   
            i=t[i];   
        }   
        i=n;   
        while(i!=1)   
        {   
            f[t[i]][i]+=v;   
            f[i][t[i]]-=v;   
            i=t[i];   
        }   
    }   
	
    bfs1();   
    bfsn();   
    
	vector<int> vv;   
    int sol=0;
	
    for(i=1;i<=mm;++i)   
    {   
        if((viz1[m[i].x] && vizn[m[i].y]) || (viz1[m[i].y] && vizn[m[i].x]))   
        {   
            vv.pb(i);   
            sol++;   
        }   
    }   
    printf("%d\n",sol);   
    for(i=0;i<sol;++i)   
        printf("%d\n",vv[i]);   
	
	fclose(stdin);
	fclose(stdout);
	
    return 0;   
}