Cod sursa(job #445446)

Utilizator jnkFDHSponge Bob jnkFDH Data 23 aprilie 2010 19:09:25
Problema Componente biconexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
/*
 * PA 2010
 * Laborator 7 - Aplicatii DFS
 *
 * Determinarea muchiilor critice
 *
 */

#include <cstdio> // daca vreti sa folositi printf, scanf
#include <iostream>
#include <fstream>
#include <vector>               

using namespace std;

#define UNDEFINED -1
#define min(a, b) ((a) < (b) ? (a) : (b))
 
typedef vector<int> *graf_t; 
 
int n, m;
graf_t G; // lista de adiacenta
int timp = 1;
int *d, *low;

void read_data(const char *filename)
{
	ifstream fin;
	int x, y;
	fin.open(filename);
	fin >> n >> m;
	G = new vector<int>[n];
	for (int i = 0; i < m; i++) {
		fin >> x >> y;
		x--; y--; // indexare de la 0
		G[x].push_back(y);
		G[y].push_back(x); // graf conex
	}
}


void dfsB(int v)
{
	d[v] = timp;
	timp++;
	low[v] = d[v];
	
	for (int i = 0; i < G[v].size(); i++)
	{
		int u = G[v][i];
	    	if (d[u] == UNDEFINED)
		{
			for(int j = 0; j < G[u].size(); j++)
				if(G[u][j] == v)
				{
					G[u].erase(G[u].begin() + j);
					break;
				}
			dfsB(u);
			low[v] = min(low[v], low[u]);
			if(low[u] > d[v])
			{
				cout<<v+1<<"-->"<<u+1<<endl;	
			}
		}
		else
			low[v] = min(low[v], d[u]);
	}
}  


void bridge()
{
	// Alocare memorie
	d = new int[n];
	low = new int[n];

	for (int v = 0; v < n; v++)
		d[v] = UNDEFINED;

	for (int v = 0; v < n; v++) {
		if (d[v] == UNDEFINED)
			dfsB(v);
	}

	// Dezalocare memorie
	delete[] d;
	delete[] low;
}

void free_data()
{
	delete[] G;
}

int main(int argc, char *argv[])
{   
    if (argc >= 2)
		read_data(argv[2]);
	else
		read_data("bridge.in");

	bridge();

	free_data();
	
	return 0;
}