我的解法就是去構造了一棵樹
以陣列的儲存方式
陣列的值存放節點的根。
排除空樹
剩下的就是出現環和多根節點的情況
也就是排除森林和有乙個節點多個入度的情況
排除森林就用到了並查集
也就是便利陣列讓其僅僅有乙個根
排除多個入度的情況更簡單
就是把這個點插入到數上時
假設這個點已經有了根節點,就出現了兩個入度
#include#include#includeusing namespace std;int sett[1000 + 100],g[1000 + 100];
int find2(int x)
int main()
int countt=0;
for(int i=1;i<=1000;i++) if(g[i]&&sett[i]==i) countt++;
// printf("countt %d\n",countt);
if(countt > 1) flag=0;
// printf("flag %d\n",flag
if(flag) printf("case %d is a tree.\n",cases);
else printf("case %d is not a tree.\n",cases);
cases++;
// for(int i=1;i<=10;i++)
// printf("%d ",i);
// printf("\n");
// for(int i=1;i<=10;i++)
// printf("%d ",sett[i]);
// printf("\n");
}return 0;
}
hdu 1325 並查集 判斷是不是一顆樹
這道題坑了我好久啊!必須寫下來 首先必須的清楚如何判斷是不是一顆樹就本題而言 1 整個圖中只能有乙個根節點,如果根節點的個數大於1個,那麼就不是樹了,而是森林。2 不能成環,也就是說兩個點之間只能有一條路徑到達,這裡可以用並查集中的並操作進行判斷 3 如果a b,必須判斷b是不是根節點,加入b不是根...
資料結構之樹(並查集)
0,2,4,6,8的標籤為0。1,3,5,7,9的標籤為1。標籤為0和1表示兩個不同的集合。查詢元素p所對應的集合編號,o 1 複雜度 private intfind int p 檢視元素p和元素q是否所屬乙個集合,o 1 複雜度 public boolean isconnected int p,i...
《資料結構》並查集與樹
查 給定乙個元素,查詢它在哪個集合內 並 合併兩個元素所在的集合 元素 結點 集合 樹 多個集合 森林 用樹的根節點作為不同樹的標誌 合併時只需要將根節點鏈結 用陣列表示樹,陣列下標表示元素值,陣列的值表示該元素對應的父親結點 father i j 元素i的父親結點是j 對於根節點 father i...