Cod sursa(job #340386)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 14 august 2009 14:16:07
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

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

#define Nmax 1005
#define pb push_back
#define Inf 0x3f3f3f3f

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

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


void bfs1()
{
	queue <int> Q;
	vector <int> :: iterator it;
	int nod,nnod,i;

	memset(viz1,0,sizeof(viz1));
	viz1[1]=1;
	for (Q.push(1);!Q.empty();Q.pop())
	{
		nod=Q.front();
		for (i=1;i<=gr[nod];++i)
		{
			nnod=G[nod][i];
			if (!viz1[nnod] && c[nnod][i]>f[nnod][i])
			{
        		Q.push(nnod);
		    	viz1[nnod]=1;
			}
		}
	}
}

void bfsn()
{
	queue <int> Q;
	vector <int> :: iterator it;
	int nod,nnod,i;

	memset(vizn,0,sizeof(vizn));
	vizn[n]=1;
	for (Q.push(n);!Q.empty();Q.pop())
	{
		nod=Q.front();
		for (i=1;i<=gr[nod];++i)
		{
			nnod=G[nod][i];
			if (!vizn[nnod] && c[nnod][i]>f[nnod][i])
			{
				Q.push(nnod);
			    vizn[nnod]=1;
			}
		}
	}
}

	
int main()
{
	int i,x,y,z,flow,u,v;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n,&mm);
	
	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]=z;
		c[y][x]=z;
	}
	
	while(flux())   
    {   
        i=n;   
        v=Inf;
		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();
	
	sol=0;
	
	vector<int> vv;
	
	for (i=1;i<=mm;++i)
	    if ((viz1[m[i].x] && vizn[m[i].y]) || (viz1[m[i].y] && vizn[m[i].x]))
		{	
			sol++;
			vv.pb(i);
		}
	
	printf("%d\n", sol);
	for (i=0;i<sol;++i)
		 printf("%d\n", vv[i]);
	
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}