warshall 判斷某無向圖是不是一個樹

判斷一個圖是否構成樹算法

問題

給定一個無向圖,判斷該圖是否構成樹。閉包

輸入

輸入有若干測試樣例。第一行是測試樣例個數,接下來若干測試樣例。 每一個測試樣例的第一行是結點數n,並且結點用1,2,…, n編號。 第二行是邊數m,接下來是 m個結點對。測試

輸出

若是一個圖是樹,則打印「YES",不然打印"NO"。每一個輸出佔一行。code

輸入樣例

3

3
2
1 2
2 3

3
3
1 2
2 3
1 3

3
1
2 3

輸出樣例

YES
NO
NO

思路:

樹是沒有簡單迴路的連通無向圖io

判斷方式:class

  1. 無向圖是連通的(用warshall算法判斷)
  2. 沒有簡單迴路(根據樹的性質:帶有n個結點的樹含有n-1條邊)

代碼實現

#include <stdio.h>
//warshall 算法 //傳遞閉包
void warshall(int matrix[][100],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);//循環次數
    
    for(int m = 0;m < num; m++){
        int flag = 1;
        int mat[100][100] = {0};
        int v,e;
        scanf("%d",&v);//點數
        scanf("%d",&e);//邊數
        //輸入全部邊
        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 判斷是否有迴路(樹的性質)
        if(v-e!=1){
           flag = 0;
        }

		//2 判斷是否連通(warshall 傳遞閉包)
        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");
        }
        
    }
}
相關文章
相關標籤/搜索