<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.algopedia.ro/wiki/index.php?action=history&amp;feed=atom&amp;title=Clasa_a_XI-a_lec%C8%9Bia_23</id>
	<title>Clasa a XI-a lecția 23 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.algopedia.ro/wiki/index.php?action=history&amp;feed=atom&amp;title=Clasa_a_XI-a_lec%C8%9Bia_23"/>
	<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_23&amp;action=history"/>
	<updated>2026-06-10T19:55:47Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_23&amp;diff=16921&amp;oldid=prev</id>
		<title>Bella: /* Componente tare conexe */</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_23&amp;diff=16921&amp;oldid=prev"/>
		<updated>2019-11-27T14:23:35Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Componente tare conexe&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Tare conexitate ==&lt;br /&gt;
Definiții: Fie G=(V,U) un graf orientat.&lt;br /&gt;
&lt;br /&gt;
Graful se numește conex dacă între oricare două noduri distincte există cel puțin un lanț.&lt;br /&gt;
&lt;br /&gt;
Se numește componentă conexă  un subgraf conex și maximal cu această calitate – dacă am mai adauga un nod, n-ar mai fi conex.&lt;br /&gt;
&lt;br /&gt;
Graful se numește &amp;#039;&amp;#039;&amp;#039;&amp;#039;tare conex&amp;#039;&amp;#039;&amp;#039;&amp;#039; dacă pentru orice pereche de noduri distincte (x,y) există cel puțin un drum de la x la y și există cel puțin un drum de la y la x.&lt;br /&gt;
&lt;br /&gt;
Se numește componentă &amp;#039;&amp;#039;&amp;#039;tare conexă&amp;#039;&amp;#039;&amp;#039; un subgraf tare conex și maximal cu această calitate – dacă am mai adauga un nod, n-ar mai fi tare conex.&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=583 Componente tare conexe] ===&lt;br /&gt;
Se dă un graf orientat cu n noduri. Să se determine câte componente tare conexe are graful dat.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
multimea elementelor componentei conexe din care face parte un nod i, este intersectia dintre&lt;br /&gt;
multimea succesorilor ( nodurile la care pot sa ajung pornind din i )&lt;br /&gt;
si mutimea predecesorilor nodului i( nodurile din care pot ajunge la i)&lt;br /&gt;
&lt;br /&gt;
Cum detemrinam cele doua mutimi?&lt;br /&gt;
Multimea Succesorilor o determin parcurgand graful cu DFS de la nodul i.&lt;br /&gt;
Vom marca succesorii in vectorul s cu i ( daca un nod x e succesor al lui i atunci s[x] = i&lt;br /&gt;
&lt;br /&gt;
Multimimea Predecesorilor o vom afla tot parcurgand cu DFS din nodul i, doar ca voi lua sensul invers al arcelor&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int a[105][105], n;&lt;br /&gt;
int suc[105];&lt;br /&gt;
int pred[105];&lt;br /&gt;
int start;                                // nodul din care pornesc dfs&lt;br /&gt;
int nrcomp;&lt;br /&gt;
void df1( int nod ){&lt;br /&gt;
  suc[nod] = nrcomp;                      // marchez nodurile cu nr nodului din care am pornit dfs&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i ++ )          // parcurg toti vecinii&lt;br /&gt;
    if( suc[i] == 0 &amp;amp;&amp;amp; a[nod][i] == 1 )   // daca nu a fost vizitat ( nu l-am marcat in vectorul de succesori )&lt;br /&gt;
      df1( i );                           // pornesc parcurgerea din acest nod&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void df2( int nod ){&lt;br /&gt;
  pred[nod] = nrcomp;&lt;br /&gt;
  for( int i = 1 ; i &amp;lt;= n ; i ++ )&lt;br /&gt;
    if( pred[i] == 0 &amp;amp;&amp;amp; a[i][nod] == 1 )&lt;br /&gt;
      df2( i );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int i, j, x, y, m;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;&lt;br /&gt;
  for( i = 1; i &amp;lt;= m; i++ ){&lt;br /&gt;
    cin &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y;&lt;br /&gt;
    a[x][y] = 1;&lt;br /&gt;
  }&lt;br /&gt;
  nrcomp = 0;                             // nr comp tare conexe gasite&lt;br /&gt;
  for(  start = 1; start &amp;lt;= n; start++ )  // luam pe rand toate nodurile grafului&lt;br /&gt;
    if( suc[start] == 0 ){                // daca nodul nu face parte dintr-o comp tare conexa&lt;br /&gt;
      nrcomp ++;                          // am mai gasit o componenta tare conexa&lt;br /&gt;
      suc[start] = nrcomp;                // marcam in vectorul succesor pentru nodul stard nr componentei conexe din care face parte&lt;br /&gt;
      df1(start); df2(start);             // parcurgem graful in adancime, determinand succesorii si predecesorii nodului start&lt;br /&gt;
      for(int j = 1; j &amp;lt;= n ; j ++ )      // verificam toate nodurile grafului&lt;br /&gt;
      if(suc[j] != pred[j] )              // daca  suc[i]!=pred[j] nodul j nu face parte din comp conexa curenta&lt;br /&gt;
          suc[j] = pred[j] = 0;&lt;br /&gt;
    }&lt;br /&gt;
  cout &amp;lt;&amp;lt; nrcomp &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Articole ==&lt;br /&gt;
Infoarena: https://www.infoarena.ro/problema/ctc&lt;br /&gt;
= Tema =&lt;br /&gt;
*[https://www.infoarena.ro/problema/plan plan]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
</feed>