diff options
| author | Santo Cariotti <sancn@live.com> | 2017-03-17 21:00:23 +0100 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-03-17 21:00:23 +0100 | 
| commit | eff9b7e3ac6f894e03d644bfba564909a260794c (patch) | |
| tree | 18772921408e1231f7f4f4088d875e22fe17b70c /Es 3.cpp | |
| parent | 47a54787726a158f89c4f0a0301cb2d80b55e267 (diff) | |
Grafi
Diffstat (limited to 'Es 3.cpp')
| -rw-r--r-- | Es 3.cpp | 109 | 
1 files changed, 109 insertions, 0 deletions
| diff --git a/Es 3.cpp b/Es 3.cpp new file mode 100644 index 0000000..d525f62 --- /dev/null +++ b/Es 3.cpp @@ -0,0 +1,109 @@ +#include <iostream>
 +#define BIANCO 0  //Non Visitato
 +#define NERO 2   //Visitato
 +#define GRIGIO 1 //Non Finito
 +#define INF 999999
 +#include <vector>
 +#include <fstream>
 +#include <queue>
 +#define MAXN 9999
 +#define INDEF -1
 +#include <stack>
 +using namespace std;
 +typedef pair <int,int> p;
 +std::priority_queue<p, std::vector<p>, std::greater<p> > Q;
 +int V,E;
 +int matriceAdj[MAXN][MAXN];
 +int T;
 +struct nodo {
 +	vector <int> adj;
 +	int inizio,fine;
 +}no[MAXN];
 + int colore[MAXN];
 + bool Ciclico=false;
 + bool dfsVisit (int u)
 + {
 + 	cout<<u<<endl;
 + 	colore[u]= GRIGIO;
 + 	int inizio=++T;
 + 	no[u].inizio=inizio;
 + 	int a;
 + 	for (int i=0;i<no[u].adj.size();i++)
 + 	{
 + 		a=no[u].adj[i];
 + 		if (colore[a]==GRIGIO) 
 +		 {
 +		 	Ciclico=true;
 +		 	return 1;
 +		 }
 + 		if ( colore[a] == BIANCO )
 + 		{
 + 			int b=dfsVisit(a);
 + 			if (b)
 + 			{
 + 				return 1;
 + 			}
 + 		}
 + 	}
 + 	colore[u]= NERO;
 + 	int fine=++T;
 + 	no[u].fine=fine;
 + 	Q.push(p(fine,inizio));
 + 	return 0;
 + }
 + 
 +  void dfsVisit2 (int u)
 + {
 + 	cout<<u<<endl;
 + 	colore[u]= GRIGIO;
 + 	int a;
 + 	for (int i=0;i<no[u].adj.size();i++)
 + 	{
 + 		a=no[u].adj[i];
 + 		if ( colore[a] == BIANCO )
 + 		dfsVisit(a);
 + 	}
 + 	colore[u]= NERO;
 + }
 + // Le chiamate ricorsive sono quanti sono i nodi GRIGI
 + void dfs()
 + {
 + 	for (int i=0;i<V;i++) colore[i]=BIANCO;
 + 	for (int i=0;i<V;i++) if (colore[i]==BIANCO)  if (dfsVisit(i)) return;
 + }
 + 
 + 
 +int main(int argc, char** argv) {
 +	ifstream in ("input.txt");
 +	ofstream out ("output.txt");
 +	in>>V>>E;
 +	int a,b;
 +	for (int i=0;i<E;i++)
 +	{
 +		in>>a>>b;
 +		no[a].adj.push_back(b);
 +	}
 +	dfs();
 +	for (int i=0;i<V;i++)
 +	{
 +		cout<<"nodo "<<i<<endl;
 +		cout<<"Inizio "<<no[i].inizio<<"   Fine "<<no[i].fine<<endl;
 +	}
 +	if (!Ciclico)
 +	{
 +	for (int i=0;i<V;i++) colore[i]=BIANCO;
 +	b=0;
 +	while (!Q.empty())
 +	{
 +		a=Q.top().first;
 +		Q.pop();
 +		if (colore[a]==BIANCO) 
 +		{
 +			dfsVisit2(a);
 +			b++;
 +		}
 +	}
 +	cout<<"Il numero di Componenti connesse e' "<<b;
 +    }
 +	return 0;
 +}
 | 
