判斷一個圖是否構成樹算法
給定一個無向圖,判斷該圖是否構成樹。閉包
輸入有若干測試樣例。第一行是測試樣例個數,接下來若干測試樣例。 每一個測試樣例的第一行是結點數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
#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"); } } }