Qraf ədəd zirvədən ibarətdir və bir ağacdır əgər və yalnız əgər:
Qraf əlaqəlidir. İlk zirvədən dərinlik üzrə axtarışa başlayın. Axtarış zamanı ziyarət olunan zirvələrin sayını sayın. Əgər bu say -ə bərabərdirsə, qraf əlaqəlidir.
|V| = |E| + 1. Əgər qraf bir ağacdırsa, o zaman n - 1 kənar ehtiva edir.
Qraf dövrə ehtiva etmir. İlk zirvədən dərinlik üzrə axtarışa başlayın. Əgər əks kənar varsa, qraf dövrəyə sahibdir və ağac deyil.
Şərtlər və və ya və yerinə yetərli olduqda, qraf ağacdır.
Nümunə
Verilmiş nümunədə göstərilən qraf ağacdır.
Alqoritmin təcəssümü — şərtlərin yoxlanması 1) və 3)
Qrafın qonşuluq matrisi və massiv elan edək.
#define MAX 110
int g[MAX][MAX], used[MAX];dfs funksiyası zirvəsindən dərinlik üzrə axtarışı yerinə yetirir. zirvəsinin əcdadı -dir. Dəyişən dövrə tapıldıqda olur.
void dfs(int v, int p)
{Əgər qraf artıq ağac deyilsə (flag = 1), axtarışa davam etməyin mənası yoxdur.
if (flag) return;zirvəsini keçilmiş kimi işarələyirik.
used[v] = 1;Ziyarət edilən zirvəsi, artırılır vahid.
c++;kənarı əks kənardır və dövrə yaradır əgər i \ne p və zirvəsi artıq keçilibsə (used[i] = 1). Dövrə tapıldıqda, flag = 1 təyin edirik. Əgər dövrə yoxdursa, zirvəsindən axtarışa davam edirik.
for(int i = 0; i < n; i++)
if ((i != p) && g[v][i])
if(used[i]) flag = 1; else dfs(i,v);
}Proqramın əsas hissəsi. Giriş məlumatlarını oxuyuruq.
scanf("%d",&n);
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
scanf("%d",&g[i][j]);Dərinlik üzrə axtarış zamanı ziyarət olunan zirvələrin sayı dəyişənində saxlanılır. Əgər qrafta dövrə yoxdursa, flag = 0 təyin edirik, dövrə tapıldıqda isə olur.
c = 0;
flag = 0;Bütün zirvələr əvvəlcə keçilməmişdir (massivin sıfırla dolur).
memset(used,0,sizeof(used));Nol zirvəsindən dərinliyə görə axtarışı başlatırıq. Bu, axtarış ağacının kökü olduğundan valdizi yoxdur. İkinci arqument kimi dfs funksiyasına dəyərini veririk.
dfs(0,-1);Əgər əks kənar varsa (flag = 1) və ya qraf əlaqəli deyilsə (c \ne n), qraf ağac deyildir.
if (flag || (c != n)) printf("NO\n"); else printf("YES\n");Alqoritmin təcəssümü — şərtlərin yoxlanması 1) və 2)
Qrafın qonşuluq matrisi və massiv elan edək.
#define MAX 101
int g[MAX][MAX], used[MAX];dfs funksiyası zirvəsindən dərinlik üzrə axtarışı yerinə yetirir.
void dfs(int v)
{zirvəsini keçilmiş kimi işarələyirik.
used[v] = 1;Ziyarət edilən zirvəsi, artırılır vahid.
c++;zirvəsindən zirvəsinə hərəkət edə biləcəyiniz hər bir zirvəsini seçirik. -dən -yə hərəkət etmək mümkündür, əgər:
kənarı mövcuddur, yəni g[v][i] = 1;
zirvəsi hələ keçilməmişdir (used[i] = 0)
Əgər hər iki şərt doğrudursa, zirvəsindən dərinlik üzrə axtarışı davam edirik.
for (int i = 1; i <= n; i++)
if (g[v][i] && !used[i]) dfs(i);
}Proqramın əsas hissəsi. Giriş dəyəri -i oxuyuruq.
scanf("%d", &n); Qraftaki kənarların sayını dəyişənində sayıram.
Edges = 0;Bütün zirvələr əvvəlcə keçilməmişdir (massivin sıfırla dolur).
memset(used, 0, sizeof(used));Qonşuluq matrisi -i oxuyur və qraftaki kənarların sayını hesablayırıq.
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
{
scanf("%d", &g[i][j]);
Edges += g[i][j];
}Qraftaki və kənarları eyni sayıldığına görə Edges dəyərini -ə bölürük.
Edges /= 2;Dərinlik üzrə axtarış zamanı ziyarət olunan zirvələrin sayı dəyişəni -də saxlanılır.
c = 0;Birinci zirvədən dərinlik üzrə axtarışı başlatırıq.
dfs(1);Qraf ağacdır əgər kənarların sayı n - 1-ə və o əlaqəlidirsə (c = n).
if ((Edges == n - 1) && (c == n)) printf("YES\n");
else printf("NO\n");Java təcəssümü
import java.util.*;
//import java.io.*;
public class Main
{
static int c = 0;
static int m[][], used[];
static void dfs(int v)
{
used[v] = 1; c++;
for(int i = 0; i < m.length; i++)
if (m[v][i]== 1 && used[i] == 0) dfs(i);
}
public static void main(String[] args) //throws IOException
{
Scanner con = new Scanner(System.in);
//Scanner con = new Scanner(new FileReader ("977.in"));
int n = con.nextInt();
m = new int[n][n];
used = new int[n];
Arrays.fill(used, 0);
int Edges = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
m[i][j] = con.nextInt();
Edges += m[i][j];
}
dfs(0); Edges /= 2;
if ((Edges == n - 1) && (c == n))
System.out.printf("YES");
else
System.out.printf("NO");
}
} Python təcəssümü — şərtlərin yoxlanması 1) və 3)
dfs funksiyası zirvəsindən dərinlik üzrə axtarışı yerinə yetirir. zirvəsinin əcdadı -dir. Dəyişən dövrə tapıldıqda olur.
def dfs(v, p):Funksiyanı istifadə edən qlobal dəyişənləri elan edək.
global flag, cƏgər qraf artıq ağac deyilsə (flag = 1), axtarışa davam etməyin mənası yoxdur.
if flag: returnzirvəsini keçilmiş kimi işarələyirik.
used[v] = 1Ziyarət edilən zirvəsi, artırılır vahid.
c += 1kənarı əks kənardır və dövrə yaradır əgər i \ne p və zirvəsi artıq keçilibsə (used[i] = 1). Dövrə tapıldıqda, flag = 1 təyin edirik. Əgər dövrə yoxdursa, zirvəsindən axtarışa davam edirik.
for i in range(n):
if i != p and g[v][i]:
if used[i]: flag = 1
else: dfs(i, v)Proqramın əsas hissəsi. Giriş məlumatını oxuyuruq.
n = int(input())Dərinlik üzrə axtarış zamanı ziyarət olunan zirvələrin sayı dəyişənində saxlanılır. Əgər qrafta dövrə yoxdursa, flag = 0 təyin edirik, dövrə tapıldıqda isə olur.
c = 0
flag = 0Bütün zirvələr əvvəlcə keçilməmişdir (used siyahısını sıfırlarla doldururuq).
used = [0] * nQonşuluq matrisi yaratırıq, əvvəlcə sıfırlarla doldururuq.
g = [[0] * n for _ in range(n)]Giriş qonşuluq matrisini oxuyuruq.
for i in range(n):
g[i] = list(map(int, input().split()))Nol zirvəsindən dərinliyə görə axtarışı başlatırıq.
dfs(0, -1)Əgər əks kənar varsa (flag = 1) və ya qraf əlaqəli deyilsə (c \ne n), qraf ağac deyildir.
if flag or c != n:
print("NO")
else:
print("YES")Python təcəssümü — şərtlərin yoxlanması 1) və 2)
dfs funksiyası zirvəsindən dərinlik üzrə axtarışı yerinə yetirir.
def dfs(v):
global czirvəsini keçilmiş kimi işarələyirik.
used[v] = 1Ziyarət edilən zirvəsi, artırılır vahid.
c += 1zirvəsindən zirvəsinə hərəkət edə biləcəyiniz hər bir zirvəsini seçirik. -dən -yə hərəkət etmək mümkündür, əgər:
kənarı mövcuddur, yəni g[v][i] = 1;
zirvəsi hələ keçilməmişdir (used[i] = 0)
Əgər hər iki şərt doğrudursa, zirvəsindən dərinlik üzrə axtarışı davam edirik.
for i in range(1, n + 1):
if g[v][i] and not used[i]: dfs(i)Proqramın əsas hissəsi. Giriş dəyəri -i oxuyuruq.
n = int(input())Qraftaki kənarların sayını dəyişənində saxlanılır.
Edges = 0Bütün zirvələr əvvəlcə keçilməmişdir (used siyahısını sıfırlarla doldururuq).
used = [0] * (n + 1)Qonşuluq matrisi yaratırıq, əvvəlcə sıfırlarla doldururuq.
g = [[0] * (n + 1) for _ in range(n + 1)]Qonşuluq matrisi -i oxuyur və dəyişənində qraftaki kənarların sayını hesablayırıq.
for i in range(1, n + 1):
g[i] = [0] + list(map(int, input().split()))
Edges += sum(g[i])Qraftaki və kənarları eyni sayıldığına görə Edges dəyərini -ə bölürük.
Edges //= 2Dərinlik üzrə axtarış zamanı ziyarət olunan zirvələrin sayı dəyişəni -də saxlanılır.
c = 0Birinci zirvədən dərinlik üzrə axtarışı başlatırıq.
dfs(1)Qraf ağacdır əgər kənarların sayı n - 1-ə və o əlaqəlidirsə (c = n).
if Edges == n - 1 and c == n:
print("YES")
else:
print("NO")