hdu1325 並查集-好題
A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edges between nodes satisfying the following properties.
There is exactly one node, called the root, to which no directed edges point.
Every node except the root has exactly one edge pointing to it.
There is a unique sequence of directed edges from the root to each node.
For example, consider the illustrations below, in which nodes are represented by circles and edges are represented by lines with arrowheads. The first two of these are trees, but the last is not.
In this problem you will be given several descriptions of collections of nodes connected by directed edges. For each of these you are to determine if the collection satisfies the definition of a tree or not.
InputThe input will consist of a sequence of descriptions (test cases) followed by a pair of negative integers. Each test case will consist of a sequence of edge descriptions followed by a pair of zeroes Each edge description will consist of a pair of integers; the first integer identifies the node from which the edge begins, and the second integer identifies the node to which the edge is directed. Node numbers will always be greater than zero.
OutputFor each test case display the line ``Case k is a tree." or the line ``Case k is not a tree.", where k corresponds to the test case number (they are sequentially numbered starting with 1).
Sample Input
6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Case 1 is a tree. Case 2 is a tree. Case 3 is not a tree.
思路:(參考大神部落格,方向性注意)不能成環,不能成樹林,任何一個節點的入度不能大於1;
ps:入度:有多少條邊指向這個點,出度就是從這個點出發有多少條邊;
#include<stdio.h> int pre[100020],flag[100020]; int find(int x)//不能路徑壓縮,遞迴找根結點; { if(pre[x]==x) return x; else return find(pre[x]); } int main() { int m,n,i,k,p=1; while(scanf("%d %d",&m,&n)!=EOF) { if(m<0&&n<0) break; int tot=0,ans=0; if(m+n==0)//m=0,n=0時條件; { printf("Case %d is a tree.\n",p++); continue; } for(i=1;i<=100010;i++) { pre[i]=i; flag[i]=0; } flag[n]=flag[m]=1;//標記m,n出現過; pre[n]=m; //這道題和前篇部落格hdu小希的迷宮類似,但這道題有方向性,詳看第一幅圖的方向; //由n指向m,而不能由m指向n,這樣查詢父親結點時就能查出入度大於1的節點了; //可以讓m,n顛倒位置看看測試 1 2 3 2 0 0,這組資料is not a tree; while(scanf("%d %d",&m,&n) && (m+n)) { flag[m]=flag[n]=1; int fx=find(m); int fy=find(n); if(fx!=fy) pre[n]=m;//同上; else ans=1; } if(ans)//有環; { printf("Case %d is not a tree.\n",p++); continue; } for(i=1;i<=100010;i++) { if(flag[i] && pre[i]==i) tot++; if(tot>1) break; } if(tot>1)//入度大於1了或者成樹林了; printf("Case %d is not a tree.\n",p++); else printf("Case %d is a tree.\n",p++); } return 0; }
相關推薦
hdu1325 並查集-好題
A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed e
齒輪[帶權並查集好題]
傳送門 我們發現如果a與b的轉比為k1 , b與c的轉比為k2 , 那麼a與c的轉比為 k1*k2 我們並查集判連通性時 , 順便維護一個dis , dis[x]表示dis與rt的轉比 維護dis時 , 每次都乘上fa的dis就可以了 , 注意dis初始值為1 當出現環時 , 如果u
Codeforces Round 722C:Destroying Array(並查集,好題)
You are given an array consisting of n non-negative integers a1, a2, ..., an. You are going to destroy integers in the array one by one. Thus, you are g
hdu 4496 並查集 反向並查集 水題 D-City
ssi fat include connected fin lines bottom printf conn 覺得這道題以後可以和優先隊列結合起來 嗯 就是說依次去掉前n條路求連通塊數量 處理的時候 只要每次merge發現父親不相等 然後進到裏面合並的時候 num--
並查集演算法題
簡要介紹: 並查集: 一種資料結構,將一個集合分為不相交的子集,在新增新的子集,合併現有子集,判斷元素所在集合時時間複雜度接近常數級。常用於求連通子圖和最小生成樹的Kruskal演算法。 操作: makeSet: &nbs
poj2236 並查集板子題
題目大意: 給你N臺電腦和一個距離D,然後給你N臺電腦的座標xi,yi,0<=xi,yi<=10000,d<=20000,給你最多3e5次查詢,每次查詢中,(O x)表示修復了x號電腦,(S x y)表示詢問x和y是否可以通訊,返回查詢結果(如果兩臺電腦距離在d之內,那麼兩臺電腦可以相
HDU 1232——暢通工程 並查集入門題
題意 :給定你n個村莊以及m條路,每條路連線兩個村莊,求還需要最少多少條路使得任意兩個村莊之間互相可以到達(直接間接都可以)。 思路 : 這是一道並查集經典的入門題,可以看這些村莊有多少個連通分量,然後連通分量的個數- 1即為答案 如圖所示,這是第一個樣例
【BZOJ3674】可持久化並查集加強版 (可持久化並查集裸題)
又到暑假了,頹了好些天的蒟蒻決定再次開始寫部落格了。由於本蒟蒻太弱了,連NOI都沒資格參加,只好在家裡看NOI的同步賽題嗚嗚嗚~。第一題一看就是可持久化並查集裸題,可是蒟蒻沒寫過。。。所以
種類並查集+入門題A Bug's Life
我覺得種類並查集還是先從一個基礎入門題講起吧。 Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they f
HDU-1213 並查集裸題
#include <cstdio> #include <cstring> #include <vector> #include <queue> #include <iostream> #include
HDU 1232 並查集板子題
得到 i++ 連接 直接 統計 com 通過 不一定 eve 某省調查城鎮交通狀況,得到現有城鎮道路統計表,表中列出了每條道路直接連通的城鎮。省政府“暢通工程”的目標是使全省任何兩個城鎮間都可以實現交通(但不一定有直接的道路相連,只要互相間接通過道路
【暢通工程 HDU - 1232 】【並查集模板題】
並查集講解和模板 有一個博文對此分析的很透徹,附連結 為避免原連結失效,現摘錄如下: 為了解釋並查集的原理,我將舉一個更有愛的例子。 話說江湖上散落著各式各樣的大俠,有上千個之多。他們沒有什麼正當職業,整天揹著劍在外面走來走去,碰到和自己不是一路人的,就免不了要打一架。但大俠們有一個優點就是講義氣,絕對不
Marriage Match II(二分+並查集+最大流,好題)
Marriage Match II http://acm.hdu.edu.cn/showproblem.php?pid=3081 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768
Supermarket(並查集,好題)
Supermarket Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11154 Accepted: 4910 Description A supermarket has a set Prod of products on
並查集樹數據結構hdu1325
ret 兩個 方式 構造 ring flag cst tree out 我的解法就是去構造了一棵樹 以數組的存儲方式 數組的值存放節點的根。 排除空樹 剩下的就是出現環和多根節點的情況 也就是排除森林和有一個節點多個入度的情況 排除森林就用到了並查集 也就是
CodeVS2492 上帝造題的七分鐘2(樹狀數組+並查集)
val inline main stream tchar sdi oot 樹狀 getchar() 傳送門 樹狀數組模板題。註意優化,假設某個數的值已經是1了的話。那麽我們以後就不用對他進行操作了,這個能夠用並查集實現。 這道題還有個坑的地方,給出
[BZOJ3211]花神遊歷各國&&[BZOJ3038] 上帝造題的七分鐘2 樹狀數組+並查集
style mat change desc lap class poj ios 分享 3211: 花神遊歷各國 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 4057 Solved: 1480[Submit][Status
Codeforces Gym 101194G Pandaria (2016 ACM-ICPC EC-Final G題, 並查集 + 線段樹合並)
body end highlight 題目 efi 預處理 ++i sin const 題目鏈接 2016 ACM-ICPC EC-Final Problem G 題意 給定一個無向圖。每個點有一種顏色。 現在給定$q$個詢問,每次詢問$x$和$w$,求所有能
洛谷P4145 上帝造題的七分鐘2/花神遊歷各國 [樹狀數組,並查集]
typedef -html org 而且 open als noip 直接 update 題目傳送門 題目背景 XLk覺得《上帝造題的七分鐘》不太過癮,於是有了第二部。 題目描述 "第一分鐘,X說,要有數列,於是便給定了一個正整數數列。 第二分鐘,L說
HDU 6271 Master of Connected Component(2017 CCPC 杭州 H題,樹分塊 + 並查集的撤銷)
AS true typedef cpp define spa tac assert struct 題目鏈接 2017 CCPC Hangzhou Problem H 思路:對樹進行分塊。把第一棵樹分成$\sqrt{n}$塊,第二棵樹也分成$\sqrt{n}$塊。