Cod sursa(job #724731)

Utilizator hiticas_abelhiticasabel hiticas_abel Data 26 martie 2012 19:09:11
Problema Critice Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <stdio.h>
#include <string.h>
#include <queue>

inline int min(int a,int b){return a<b?a:b;}
using namespace std;

int n, maxflow = 0, flow;
int a[1001][1001],m[1001][1001],con,muchii[1001][10001],a_catea[1001],numanoi;
int t[1001];
queue<int> coada;
FILE *fout = fopen("critice.out", "w");
void read();
void solve();
void write();
int bfs();

int testez(int i,int j)
{
	int aux1,aux2;
	aux1=a[i][j];
	aux2=a[j][i];
	
	a[i][j]=a[j][i]=0;
	
	bfs();
	//daca am atins unul dintre capete
    if (t[i]==1||t[j]==1) return 1;
       
	
	a[i][j]=aux1;
    	a[j][i]=aux2;
		
		
				
		

	return 0;	
}

int main()
{int i,j;
	read();
	solve();
	
		for(i=1;i<n;i++)
			for(j=i+1;j<=n;j++)
				if ((m[i][j]==a[j][i]||m[j][i]==a[i][j])&&(muchii[i][j]||muchii[j][i]))
					 if (testez(i,j))   
						{con++;
					    a_catea[muchii[i][j]]=1;}
						
					
	write();
	return 0;
}




int bfs()
{

	int i, nod;
	//golesc coada
	//deoarece folosesc coada de mai multe ori
	//o apelez din bfs()
	while (!coada.empty()) 
		
		coada.pop();
	
	memset(t,0,sizeof(t));
	//pun in vectorul t valoare 0(zero)
    coada.push(1);
	//pun in coada valoarea 1
   t[1]=1;  //t vine de la tata
    while (!coada.empty())
	{
		nod = coada.front();
		
		
		for (i = 2; i <= n; ++i)
		
			if (a[nod][i] && !t[i])
			{
				t[i] = nod;
				if (i==n) return 1;  //am ajuns la nodul destinatie 
                coada.push(i);    
				
             }
             coada.pop();  //elimin primul element din  coada
		
	}
return 0;       //nu pot ajunge la nodul destinatie
}

void solve()
{
	int i; 

	while (bfs())
	{
		flow = 1000000;
		
	
	//determin fluxul minim
		for (i = n; i!=1; i=t[i])
		{
			flow=min(flow,a[t[i]][i]);
		}
		
		for (i = n; i!=1; i = t[i])
		{
			a[t[i]][i] -= flow;
	     	a[i][t[i]] += flow;
		}
		maxflow += flow;
	}
}

void write()
{
	
	fprintf(fout, "%d\n", con);
	
	
	int i,j;
	
	
	for(i=1;i<=numanoi;i++)
		if (a_catea[i]==1) fprintf(fout,"%d\n",i); 
		
		

	
	fclose(fout);
}

void read()
{
	int m, x, y, z,i,j;
	FILE *fin = fopen("critice.in", "r");
	fscanf(fin, "%d%d", &n, &m);
	for (i=1;i<= m; i++)
	{
		fscanf(fin, "%d%d%d", &x, &y, &z);
	 	a[x][y] = z;
		muchii[y][x]=muchii[x][y]=i;
	}
	
		
	numanoi=m;
	fclose(fin);
}