hdu 1325 並查集 判斷是不是一顆樹

2021-06-22 17:46:36 字數 992 閱讀 5273

這道題坑了我好久啊!!!!!必須寫下來;

首先必須的清楚如何判斷是不是一顆樹就本題而言:(1)整個圖中只能有乙個根節點,如果根節點的個數大於1個,那麼就不是樹了,而是森林。

(2)不能成環,也就是說兩個點之間只能有一條路徑到達,這裡可以用並查集中的並操作進行判斷

(3)如果a->b,必須判斷b是不是根節點,加入b不是根節點,就不能讓a->b;

另外要注意的乙個地方就是:結束條件

如果你寫成:if (x==-1&&y==-1)break;

那麼就會re

應該改為:  if(x<0&&y<0)break;

附上**:

#include

#include

using namespace std;

int f[100100],visit[100100],flag; //f陣列存i節點的父節點,visit陣列記錄某個點是否被訪問

int find(int x)    //查操作,找到每個節點的祖先節點

void make(int a,int b) //並操作

int main()

for(int i=1;i<=100010;i++)   //初始化

flag=1;

max=0;               

visit[a]=visit[b]=1;

if(a>max)max=a;   //max 存節點編號的最大值

if(b>max)max=b;

make(a,b);

while(cin>>a>>b)

if(!flag)

int k=0;

for(int i=1;i<=max;i++)

if(k>1)

printf("case %d is not a tree.\n",test++);

else

printf("case %d is a tree.\n",test++);

}return 0;   

}

hdu 1325判斷是不是樹

roblem description 上次gardon的迷宮城堡小希玩了很久 見problem b 現在她也想設計乙個迷宮讓gardon來走。但是她設計迷宮的思路不一樣,首先她認為所有的通道都應該是雙向連通的,就是說如果有乙個通道連通了房間a和b,那麼既可以通過它從房間a走到房間b,也可以通過它從房...

並查集樹資料結構hdu1325

我的解法就是去構造了一棵樹 以陣列的儲存方式 陣列的值存放節點的根。排除空樹 剩下的就是出現環和多根節點的情況 也就是排除森林和有乙個節點多個入度的情況 排除森林就用到了並查集 也就是便利陣列讓其僅僅有乙個根 排除多個入度的情況更簡單 就是把這個點插入到數上時 假設這個點已經有了根節點,就出現了兩個...

HDU3938 並查集 並查集

先按邊權值排個序,每次加入一條邊,用並查集,關鍵看懂題。include include include include using namespace std const int maxn 10010 int n,m,q struct edge edges maxn 5 inline int cmp...