Pagini recente » Cod sursa (job #2379960) | Cod sursa (job #2446251) | Cod sursa (job #626151) | Cod sursa (job #3294473) | Cod sursa (job #445446)
Cod sursa(job #445446)
/*
* 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;
}