infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva educationala => Subiect creat de: Filip Cristian Buruiana din Martie 01, 2008, 15:38:36



Titlul: 014 Parcurgere DFS - componente conexe
Scris de: Filip Cristian Buruiana din Martie 01, 2008, 15:38:36
Aici puteti discuta despre problema Parcurgere DFS - componente conexe (http://infoarena.ro/problema/dfs).


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Pajarcu Alexandru-Petrisor din Martie 07, 2008, 18:19:16
de ce la testul 17 e raspuns 2?


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Gabriel Bitis din Martie 07, 2008, 19:06:46
Pai o explicatie stiintifica nu pot sa'ti dau, dar daca s'au luat punctaje de 100, pe aceleasi teste pe care ai luat tu 95, inseamna ca la testul 17 chiar sunt 2 componente conexe, de'aia raspunsul e 2.
Componentele sunt fomate din nodurile de la 1 la 99997 respectiv de la 99998 la 100000.


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Pajarcu Alexandru-Petrisor din Martie 07, 2008, 20:00:20
oricum testul 17 e gresit:
sunt 100000 de muchii,iar fisierul de intrare are 99999


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Andrei Grigorean din Martie 07, 2008, 23:09:58
Am modificat testul 17 si am reevaluat :).


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Andrei Misarca din Septembrie 15, 2008, 18:43:01
Am si eu o intrebare... stiu ca e putin ciudata, da' limba romana nu e punctu' meu forte :D Ce inseamna componente conexe? :D


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Filip Cristian Buruiana din Septembrie 15, 2008, 20:25:24
O componenta conexa intr-un graf neorientat este o submultime maximala C a multimii de noduri astfel incat oricare ar fi doua noduri x si y din C, exista drum de la x la y si de la y la x.
Google it. In plus, uita-te pe sursele din arhiva si ai sa vezi cum functioneaza algoritmul de determinare a componentelor astea.


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Andrei Misarca din Septembrie 16, 2008, 16:46:44
Mersi fain. Am inteles :)


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Zajzon Barna din Ianuarie 01, 2009, 21:45:12
Este DFS mai rapid decat BFS :?, sau este numai legat de testele acestea? cu al doilea am luat 60 de puncte.


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: razyelx din Martie 02, 2009, 20:22:44
DFS are aceeasi complexitate cu BFS: O(n+m).


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Pripoae Teodor Anton din Martie 02, 2009, 20:48:18
E adevarat, doar ca una este recursiva iar cealalta iterativa, de aici diferenta de timp. Probabil ca ai folosit STL la bfs, care merge mai incet ca stiva (sa ma corecteze cineva daca gresesc), sau la bfs ai bagat de mai multe ori nodurile in coada :),


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: razyelx din Martie 02, 2009, 21:27:05
Se poate DFS si iterativ. Si ma chinui acum sa il implementez, dar nu am alte idei decat sa imi creez o stiva care sa o inlocuiasca pe cea din sistem pt functii. A facut careva interativ DFS?


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Florian Marcu din Martie 02, 2009, 21:40:19
dar nu am alte idei decat sa imi creez o stiva care sa o inlocuiasca pe cea din sistem pt functii.

Pai altfel nu ai cum.  :) Iti retii in stiva nodurile, in ordinea parcurgerii. Atunci cand nu mai ai unde sa mergi din nodul st[vf], stergi varful stivei (--vf), si incerci noul varf (ii parcurgi vecinii). Repeti procedeul pana cand stiva devine vida. Uite un pseudocod:

Cod:
- introduc in stiva nodul de start
- cat timp am elemente in stiva:
   -- daca nodul din varful stivei are un vecin nevizitat atunci
        ---vizitez vecinul. [ viz[nod] = 1; ]
        ---introduc in stiva vecinul. [ st[++vf] = nod;
   --altfel, scot din stiva nodul din varf. [ --vf ].
-
Implementarea e simpla! Succes!


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Radu Lucian Andrei din Martie 11, 2009, 08:40:41
am facut-o cu liste si merge viss... :banana:


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: alexandru din Martie 11, 2009, 20:46:28
Citat
Pai altfel nu ai cum. 
Merge si recursiv ,sursa  oficiala  e facuta recursiv ;)


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Florian Marcu din Martie 11, 2009, 21:07:17
Postul tau e cam degeaba.  :) Daca ai fi citit cu atentie, ti-ai fi dat seama ca ma refeream la cum poate sa faca iterativ. Adica sa transforme algoritmul recursiv in iterativ, prin simularea stivei. Prin "altfel nu ai cum" ma refeream la faptul ca simularea stivei e obligatorie pentru a face iterativ.


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Alexandru-Iancu Caragicu din Aprilie 07, 2010, 15:50:49
Eu am facut cu matrice de adiacenta si am luat 100. :)


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Gabriel Bitis din Aprilie 07, 2010, 15:56:46
Tu ai liste de vecini, nu matrice de adiacenta.
Matricea de adiacenta e o matrice A de dimensiune N x N, unde A[ i ][ j ] = 1 daca exista muchie de la nodul i la nodul j, sau A[ i ][ j ] = 0 in caz contrar.


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Duduman Bogdan Vlad din Iulie 19, 2010, 16:32:17
Eu iau de la testu 12-20 - Killed by signal 11. :-? imi poate spune cnv unde e 'problema' pe solutia trimisa?


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Mircea Dima din Iulie 19, 2010, 17:27:26
Eu iau de la testu 12-20 - Killed by signal 11. :-? imi poate spune cnv unde e 'problema' pe solutia trimisa?

Vezi ca limita e 1 <= N <= 100 000 !!! (tu ai declarat vectorii de 10 005 )


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Little Lady din Februarie 16, 2011, 17:00:39
imi poate spune cineva, va rog, ce inseamna eroarea "Non-zero exit status." in borderoul de evaluare ?  :?
multumesc..


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: George Marcus din Februarie 16, 2011, 17:34:17
Cod:
1 ≤ N ≤ 100 000
Tu ai declarat o matrice [0..100,0..100], deci dupa ce citesti (de exemplu) 101 incerci sa accesezi o zona de memorie nealocata.
Va trebui sa retii matricea sub forma de liste de adiacenta.


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: moraru alexandru sebastian din Martie 02, 2011, 16:30:20
salutare!...
am si eu o problema...trimit sursa si iau doar 15 pct:-? si pe restul testelor "incorect"...dar oricate teste as da eu...imi da ok! daca are cineva timp sa se uite pe sursa...poate vede greseala pe care nu o vad eu:-?
adresa e: http://infoarena.ro/job_detail/544998 (http://infoarena.ro/job_detail/544998)


am rezolvat...multumesc oricum :peacefingers:

 Nu posta consecutiv pe aceeasi tema. Editeaza-ti mesajele anterioare!


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Dan H Alexandru din Iulie 07, 2012, 12:18:24
Si ... de unde as putea invata cum se lucreaza cu pointeri ?


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Dumitru Andrei Georgian din Iulie 07, 2012, 12:33:23
http://zanasi.chem.unisa.it/download/C.pdf -> aceasta carte contine tot ce iti trebuie despre limbajul C. Capitolul 5 este dedicat pointerilor   :)
Vezi ca la problema asta poti sa eviti folosirea pointerilor. Iti poti tine un vector din stl cu vecinii fiecarui nod  :wink:


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Dan H Alexandru din Iulie 07, 2012, 13:50:31
Multumesc frumos.  :ok: Stiu ca se poate fara ( am si facut fara  :) ) , insa din intamplare am observat ca sursa oficiala e cu pointeri.


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: hiticasabel din Iunie 27, 2013, 12:33:12
Cum as putea simula recursivitatea cu ajutorul unei structuri de date?


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Pirtoaca George Sebastian din Iunie 27, 2013, 13:10:16
Foloseste o stiva exact pe principiul recursivitatii.  :ok:


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: CHIRILA ADRIAN din Octombrie 29, 2013, 18:33:56
Algoritmul este exact acelasi cu sursa de 50 de puncte...si totusi primesc doar 5 :)...ma poate lamuri cineva? ](*,),Am incercat sa implementez si listele de adiacenta si primesc doar 10 puncte..
#include <iostream>
#include <cstdio>
#define Nmax 1001
using namespace std;
int n,i,j,cmp=0;
int a[Nmax][Nmax];
bool viz[Nmax];
void citire(int &n)
{
    int m;
    freopen("dfs.in","r",stdin);
    freopen("dfs.out","w",stdout);
    scanf("%d %d",&n,&m);
    int x,y;
    for(i=1;i<=m;++i)
    {
        scanf("%d %d",&x,&y);
        a
  • [y]=1;
        a[y]
  • =1;
    }
}
void dfs(int x)
{
    viz
  • =1;
    for(i=1;i<=n;++i)
     if (!viz && a
  • ) dfs(i);
}
int main()
{
    citire(n);
    for(i=1;i<=n;++i)
     if (!viz) {++cmp;dfs(i);}
    printf("%d",cmp);
    return 0;
}


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Cobuz Andrei din Octombrie 30, 2013, 17:17:27
Nu mai folosi variabile globale, daca nu stii cum sa le administrezi. Variabila "i" va fi folosita si in functia main si in functia dfs.
Pentru testul 3 0 programul tau da 1 cand ar trebui sa dea 3


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Ungurianu Alexandru din Decembrie 10, 2013, 23:56:35
Imi poate spune si mie cineva ce probleme ar trebui sa rezolv pentru a consolida grafurile? Pana acum stiu bfs si dfs, si am inteles cat de cat floyd-warshall.


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: andrei din Februarie 08, 2016, 12:56:58
Se poate rezolva si cu paduri de multimi disjuncte foarte frumos  :ok:


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Luca Beatrice Bianca din Martie 22, 2016, 19:11:26
Imi poate explica si mie cineva de ce imi da doar 5 pct la programul asta:

#include<iostream>
#include<fstream>
#include<vector>
#include<map>
using namespace std;

pair<int, int> P;
vector<pair<int, int> > v;

map<int, vector<int> > lista;

int n,m,a,b, viz[100];

void citire()
{
    ifstream f("dfs.in");
    f>>n>>m;
    for(int i=1;i<=m;i++)
    {
        f>>a>>b;
        lista[a].push_back(b);
        lista.push_back(a);
    }
}

void df(int nod)
{
    viz[nod]=1;
    for(int i=0;i<lista[nod].size();i++)
        if(viz[lista[nod]]==0)
            df(lista[nod]);
}

int comp_conex()
{
    int k=0;
    for(int i=1;i<=n;i++)
    {
        if(viz==0)
        {
            df(i);
            k++;
        }
    }
    return k;
}

int main()
{
    ofstream g("dfs.out");
    citire();
    g<<comp_conex();
}

Raspunsul e corect..oare nu accepta implementarea cu map, vector, pair?..


Titlul: Răspuns: 014 Parcurgere DFS - componente conexe
Scris de: Mihai Calancea din Martie 22, 2016, 19:37:43
Salut! Vectorul tău viz[] este mult prea mic pentru datele de intrare.
Apropo, n-ai niciun motiv să folosești map la problema asta. Poți să declari lista așa:
Cod:
vector<vector<int>> lista(n + 1, vector<int>())
.