Κοινή χρήση τεχνολογίας

AcWing 3587: Συνδεδεμένο γράφημα ← dfs (πίνακας γειτνίασης ή αλυσοδεμένο προς τα εμπρός αστέρι)

2024-07-12

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

[Πηγή της ερώτησης]
https://www.acwing.com/problem/content/3590/

[Περιγραφή Τίτλου]
Με δεδομένο ένα μη κατευθυνόμενο γράφημα και όλες τις ακμές του, προσδιορίστε εάν όλες οι κορυφές αυτού του γραφήματος είναι συνδεδεμένες.

【Μορφή εισαγωγής】
Η είσοδος περιέχει πολλά σύνολα δεδομένων.
Η πρώτη γραμμή κάθε συνόλου δεδομένων περιέχει δύο ακέραιους αριθμούς n και m, που αντιπροσωπεύουν τον αριθμό των σημείων και των ακμών του μη κατευθυνόμενου γραφήματος.
Οι επόμενες m γραμμές, κάθε γραμμή περιέχει δύο ακέραιους x, y, που υποδεικνύουν ότι το σημείο x και το σημείο y είναι συνδεδεμένα.
Τα σημεία αριθμούνται από το 1 έως το n.
Μπορεί να υπάρχει στην εικόνα
Διπλη ακρηκαιΑυτο-βρόχος

[Μορφή εξόδου]
Κάθε σύνολο δεδομένων εξάγει μία γραμμή και ένα αποτέλεσμα Εάν είναι συνδεδεμένες όλες οι κορυφές, βγάζετε ΝΑΙ, διαφορετικά βγάζετε ΟΧΙ.

【φασμα ΔΕΔΟΜΕΝΩΝ】
Η είσοδος περιέχει έως και 10 σετ δεδομένων.
1≤n≤1000,
1≤m≤5000,
1≤x,y≤n

【Δείγμα εισαγωγής】
4 3
1 2
2 3
3 2
3 2
1 2
2 3

【Δείγμα εξόδου】
ΟΧΙ
ΝΑΙ

【Ανάλυση Αλγορίθμων】
● Το «
Και ψάξτε τη συλλογή"Για λεπτομέρειες εφαρμογής κώδικα, δείτε:https://blog.csdn.net/hnjzsyjyj/article/details/126455868
● Η αρχή της χρήσης dfs για τον προσδιορισμό του συνδεδεμένου γραφήματος σε αυτήν την ερώτηση βρίσκεται στο "
Τα dfs πρέπει να μπορούν να διασχίζουν όλα τα σημεία του συνδεδεμένου γραφήματος". Εάν ένα σημείο δεν διασχίζεται, σημαίνει ότι δεν είναι συνδεδεμένο.

[Κωδικός αλγορίθμου: dfs+chained forward star]
● Πρότυπο αλγορίθμου dfs:
https://blog.csdn.net/hnjzsyjyj/article/details/118736059
● Για λεπτομέρειες σχετικά με τα μπροστινά αστέρια αλυσίδας, δείτε: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. */

[Κωδικός αλγορίθμου: dfs+πίνακας γειτνίασης]
● Πρότυπο αλγορίθμου dfs:
https://blog.csdn.net/hnjzsyjyj/article/details/118736059
● Υλοποίηση πίνακα γειτνίασης μη κατευθυνόμενου μη σταθμισμένου γραφήματος: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. */



【βιβλιογραφικές αναφορές】
https://www.acwing.com/solution/content/124095/

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