Technologieaustausch

AcWing 3587: Verbundener Graph ← dfs (Adjazenzmatrix oder verketteter Vorwärtsstern)

2024-07-12

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

[Quelle der Frage]
https://www.acwing.com/problem/content/3590/

[Titel Beschreibung]
Bestimmen Sie anhand eines ungerichteten Graphen und aller darin enthaltenen Kanten, ob alle Eckpunkte dieses Graphen verbunden sind.

【Eingabeformat】
Die Eingabe enthält mehrere Datensätze.
Die erste Zeile jedes Datensatzes enthält zwei ganze Zahlen n und m, die die Anzahl der Punkte und Kanten des ungerichteten Graphen darstellen.
In den nächsten m Zeilen enthält jede Zeile zwei ganze Zahlen x, y, was darauf hinweist, dass Punkt x und Punkt y verbunden sind.
Die Punkte sind von 1 bis n nummeriert.
Möglicherweise auf dem Bild
zweischneidigUndSelbstschleife

[Ausgabeformat]
Jeder Datensatz gibt eine Zeile und ein Ergebnis aus. Wenn alle Eckpunkte verbunden sind, geben Sie JA aus, andernfalls geben Sie NEIN aus.

【Datenreichweite】
Die Eingabe enthält bis zu 10 Datensätze.
1≤n≤1000,
1≤m≤5000,
1≤x,y≤n

【Eingabebeispiel】
4 3
1 2
2 3
3 2
3 2
1 2
2 3

【Ausgabebeispiel】
NEIN
JA

【Analyse von Algorithmen】
● Das „
Und durchsuchen Sie die Sammlung„Details zur Code-Implementierung finden Sie unter:https://blog.csdn.net/hnjzsyjyj/article/details/126455868
● Das Prinzip der Verwendung von dfs zur Bestimmung des verbundenen Diagramms in dieser Frage liegt in „
dfs muss in der Lage sein, alle Punkte des verbundenen Diagramms zu durchlaufen". Wenn ein Punkt nicht durchlaufen wird, bedeutet dies, dass er nicht verbunden ist.

[Algorithmuscode: dfs + verketteter Vorwärtsstern]
● DFS-Algorithmusvorlage:
https://blog.csdn.net/hnjzsyjyj/article/details/118736059
● Einzelheiten zu Kettenvorwärtssternen finden Sie unter: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. */

[Algorithmuscode: dfs + Adjazenzmatrix]
● DFS-Algorithmusvorlage:
https://blog.csdn.net/hnjzsyjyj/article/details/118736059
● Adjazenzmatrix-Implementierung eines ungerichteten ungewichteten Graphen: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. */



【Verweise】
https://www.acwing.com/solution/content/124095/

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