# warshall judge whether an undirected graph is a tree

Keywords: C

Determine whether a graph is a tree

### problem

Given an undirected graph, we can judge whether the graph is a tree.

### input

The input has several test samples. The first line is the number of test samples, followed by several test samples. The first line of each test sample is the node number n, and the nodes use 1,2 , n number. The second line is the number of sides m, followed by M node pairs.

### output

If a graph is a tree, print "YES", otherwise print "NO". One line per output.

```3

3
2
1 2
2 3

3
3
1 2
2 3
1 3

3
1
2 3
```

```YES
NO
NO
```

### Ideas:

A tree is a connected undirected graph without a simple circuit

Judgment method:

1. Undirected graph is connected (judged by warshall algorithm)
2. There is no simple circuit (according to the nature of the tree: a tree with n nodes contains n-1 edges)

### code implementation

```#include <stdio.h>
//warshall algorithm / / pass closure
void warshall(int matrix[],int size){
for(int j = 0; j < size; j ++){
for(int i = 0; i < size; i ++){
if(matrix[i][j] == 1){
for(int k = 0; k < size; k ++){
matrix[i][k] = matrix[j][k] || matrix[i][k];
}
}
}
}
}

int main(){
int num;
scanf("%d",&num);//Number of cycles

for(int m = 0;m < num; m++){
int flag = 1;
int mat = {0};
int v,e;
scanf("%d",&v);//Point
scanf("%d",&e);//Edge number
//Enter all sides
for(int i = 0; i < e; i++){
int j,k;
scanf("%d",&j);
scanf("%d",&k);
mat[j-1][k-1] = 1;
mat[k-1][j-1] = 1;
mat[i-1][i-1] = 1;
}
//1 determine whether there is a loop (the nature of the tree)
if(v-e!=1){
flag = 0;
}

//2 determine whether it is connected (warshall pass closure)
warshall(mat, v);
for(int j = 0; j < v; j++){
for(int k = 0; k < v; k++){
if(mat[j][k]!=1){
flag = 0;
}
}
}
if(flag==0){
printf("NO\n");
}else{
printf("YES\n");
}

}
}
```

Posted by jasonhardwick on Mon, 04 May 2020 11:39:18 -0700