Partage de technologie

AcWing 3587 : Graphe connecté ← dfs (matrice de contiguïté ou étoile avant enchaînée)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

[Source de la question]
https://www.acwing.com/problem/content/3590/

[Description du titre]
Étant donné un graphe non orienté et toutes ses arêtes, déterminez si tous les sommets de ce graphe sont connectés.

【Format d'entrée】
L'entrée contient plusieurs ensembles de données.
La première ligne de chaque ensemble de données contient deux entiers n et m, représentant le nombre de points et d'arêtes du graphe non orienté.
Les m lignes suivantes, chaque ligne contient deux entiers x, y, indiquant que le point x et le point y sont connectés.
Les points sont numérotés de 1 à n.
Il y en a peut-être sur la photo
double tranchantetAuto-boucle

[Format de sortie]
Chaque ensemble de données génère une ligne et un résultat. Si tous les sommets sont connectés, affichez OUI, sinon affichez NON.

【plage de données】
L'entrée contient jusqu'à 10 ensembles de données.
1≤n≤1000,
1≤m≤5000,
1≤x,y≤n

【Échantillon d'entrée】
4 3
1 2
2 3
3 2
3 2
1 2
2 3

【Échantillon de sortie】
NON
OUI

【Analyse des algorithmes】
● Le « 
Et fouillez la collection"Pour plus de détails sur l'implémentation du code, veuillez consulter :https://blog.csdn.net/hnjzsyjyj/article/details/126455868
● Le principe de l'utilisation de dfs pour déterminer le graphe connecté dans cette question réside dans «
dfs doit être capable de parcourir tous les points du graphe connecté". Si un point n'est pas parcouru, cela signifie qu'il n'est pas connecté.

[Code de l'algorithme : dfs + étoile avant enchaînée]
● modèle d'algorithme dfs :
https://blog.csdn.net/hnjzsyjyj/article/details/118736059
● Pour plus de détails sur les étoiles en chaîne, veuillez consulter :https://blog.csdn.net/hnjzsyjyj/article/details/139369904

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e3+5;
  4. const int M=5e3+5;
  5. int e[M<<1],ne[M<<1],h[N],idx;
  6. bool st[N];
  7. int n,m;
  8. void add(int a,int b) {
  9. e[idx]=b,ne[idx]=h[a],h[a]=idx++;
  10. }
  11. void dfs(int u) {
  12. st[u]=1;
  13. for(int i=h[u]; i!=-1; i=ne[i]) {
  14. int j=e[i];
  15. if(!st[j]) dfs(j);
  16. }
  17. }
  18. int main() {
  19. while(cin>>n>>m) {
  20. memset(st,false,sizeof st);
  21. memset(h,-1,sizeof h);
  22. idx=0;
  23. while(m--) {
  24. int a,b;
  25. cin>>a>>b;
  26. add(a,b),add(b,a);
  27. }
  28. dfs(1);
  29. bool flag=true;
  30. for(int i=1; i<=n; i++)
  31. if(!st[i]) {
  32. flag=false;
  33. break;
  34. }
  35. if(flag) cout<<"YES"<<endl;
  36. else cout<<"NO"<<endl;
  37. }
  38. return 0;
  39. }
  40. /*
  41. in:
  42. 4 3
  43. 1 2
  44. 2 3
  45. 3 2
  46. 3 2
  47. 1 2
  48. 2 3
  49. out:
  50. NO
  51. YES
  52. */

[Code de l'algorithme : dfs+matrice de contiguïté]
● modèle d'algorithme dfs :
https://blog.csdn.net/hnjzsyjyj/article/details/118736059
● Implémentation de la matrice de contiguïté d'un graphe non orienté non pondéré :https://blog.csdn.net/hnjzsyjyj/article/details/116245897

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=1010;
  4. int g[N][N];
  5. bool st[N];
  6. int n,m;
  7. void dfs(int u) {
  8. st[u]=true;
  9. for(int i=1; i<=n; i++)
  10. if(!st[i] && g[u][i]!=0) dfs(i);
  11. }
  12. int main() {
  13. while(cin>>n>>m) {
  14. memset(g,0,sizeof g);
  15. memset(st,false,sizeof st);
  16. int x,y;
  17. while(m--) {
  18. cin>>x>>y;
  19. g[x][y]=g[y][x]=1;
  20. }
  21. dfs(1);
  22. int i;
  23. for(i=1; i<=n; i++) {
  24. if(!st[i]) break;
  25. }
  26. if(i<=n) cout<<"NO"<<endl;
  27. else cout<<"YES"<<endl;
  28. }
  29. return 0;
  30. }
  31. /*
  32. in:
  33. 4 3
  34. 1 2
  35. 2 3
  36. 3 2
  37. 3 2
  38. 1 2
  39. 2 3
  40. out:
  41. NO
  42. YES
  43. */



【les références】
https://www.acwing.com/solution/content/124095/

https://blog.csdn.net/hnjzsyjyj/article/details/118736059
https://blog.csdn.net/hnjzsyjyj/article/details/139369904