并查集入門三連:HDU1213 POJ1611 POJ2236

HDU1213

http://acm.hdu.edu.cn/showproblem.php?pid=1213

問題描述

今天是伊格納修斯的生日。他邀請了很多朋友。現在是晚餐時間。伊格納修斯想知道他至少需要多少桌子。你必須注意到并非所有的朋友都互相認識,而且所有的朋友都不想和陌生人呆在一起。

這個問題的一個重要規則是,如果我告訴你A知道B,B知道C,那意味著A,B,C彼此了解,所以他們可以留在一個表中。

例如:如果我告訴你A知道B,B知道C,D知道E,所以A,B,C可以留在一個表中,D,E必須留在另一個表中。所以Ignatius至少需要2張桌子。

輸入

輸入以整數T(1 <= T <= 25)開始,表示測試用例的數量。然后是T測試案例。每個測試用例以兩個整數N和M開始(1 <= N,M <= 1000)。N表示朋友的數量,朋友從1到N標記。然后M行跟隨。每一行由兩個整數A和B(A!= B)組成,這意味著朋友A和朋友B彼此了解。兩個案例之間會有一個空白行。

?

對于每個測試用例,只輸出Ignatius至少需要多少個表。不要打印任何空白。

樣本輸入

2

5 3

1 2

2 3

4 5

?

5 1

2 5

樣本輸出

2

4

并查集基礎題

#include<cstdio>
#include<iostream>
using namespace std;
int fa[1005];
int n,m;
void init()//初始化
{for(int i=0;i<1005;i++)fa[i]=i;
}
int find(int x)//尋根
{if(fa[x]!=x)fa[x]=find(fa[x]);return fa[x];
}
void union(int x,int y)//判斷、合并
{int a=find(x),b=find(y);if(a!=b)fa[b]=a;
}
int main()
{int t;scanf("%d",&t);while(t--){int a,b,cnt=0;scanf("%d%d",&n,&m);init();for(int i=1;i<=m;i++)//合并{scanf("%d%d",&a,&b);union(a,b);}for(int i=1;i<=n;i++)//統計{find(i);if(find(i)==i)cnt++;}printf("%d\n",cnt);}return 0;
}

POJ1611

http://poj.org/problem?id=1611

描述

嚴重急性呼吸系統綜合癥(SARS)是一種病因不明的非典型肺炎,在2003年3月中旬被認為是一種全球性威脅。為了盡量減少對他人的傳播,最好的策略是將嫌疑人與其他嫌疑人分開。?
在Not-Spreading-Your-Sickness University(NSYSU),有許多學生團體。同一組中的學生經常互相交流,學生可以加入幾個小組。為了防止可能的SARS傳播,NSYSU收集所有學生組的成員列表,并在其標準操作程序(SOP)中制定以下規則。?
一旦組中的成員是嫌疑人,該組中的所有成員都是嫌疑人。?
然而,他們發現,當學生被認定為嫌疑人時,識別所有嫌疑人并不容易。你的工作是編寫一個找到所有嫌疑人的程序。

輸入

輸入文件包含幾種情況。每個測試用例以一行中的兩個整數n和m開始,其中n是學生數,m是組的數量。您可以假設0 <n <= 30000且0 <= m <= 500.每個學生都使用0到n-1之間的唯一整數進行編號,并且最初學生0在所有情況下都被識別為嫌疑人。該行后面是組的m個成員列表,每組一行。每行以整數k開頭,表示組中的成員數。在成員數量之后,有k個整數代表該組中的學生。一行中的所有整數由至少一個空格分隔。?


n = 0且m = 0的情況表示輸入結束,無需處理。

?

對于每種情況,輸出一行中的嫌疑人數量。

樣本輸入

100 4
2 1 2
5 10 13 11 12 14
2 0 1
2 99 2
200 2
1 5
5 1 2 3 4 5
1 0
0 0

樣本輸出

4
1
1

?

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include <string>
using namespace std;
int a[30001],pre[30001];
int find(int x)//尋根
{if(pre[x]==x)return x;elsereturn pre[x]=find(pre[x]);
}
void union(int x, int y)//合并
{int fx = find(x), fy = find(y);if (fx != fy)pre[fy] = fx;
}int main()
{int n,m;while (scanf("%d%d", &n, &m) != EOF && (n || m)){int sum = 0;for (int i = 0; i < n; i++)//初始化pre[i] = i;for (int i = 0; i < m; i++){int k;scanf("%d", &k);if (k >= 1){scanf("%d", &a[0]);for (int j = 1; j < k; j++){scanf("%d", &a[j]);//接收union(a[0], a[j]);//和0號一組}}}for (int i = 0; i < n; i++)//統計if (find(i) ==pre[0])sum++;printf("%d\n", sum);}return 0;
}

?POJ2236

http://poj.org/problem?id=2236

描述

地震發生在東南亞。ACM(亞洲合作醫療團隊)已經與膝上電腦建立了無線網絡,但是一次意外的余震襲擊,網絡中的所有計算機都被打破了。計算機一個接一個地修復,網絡逐漸開始工作。由于硬件限制,每臺計算機只能直接與距離它不遠的計算機進行通信。但是,每臺計算機都可以被視為兩臺計算機之間通信的中介,也就是說,如果計算機A和計算機B可以直接通信,或者計算機C可以與A和A進行通信,則計算機A和計算機B可以進行通信。 B.?

在修復網絡的過程中,工作人員可以隨時進行兩種操作,修復計算機或測試兩臺計算機是否可以通信。你的工作是回答所有的測試操作。?

輸入

第一行包含兩個整數N和d(1 <= N <= 1001,0 <= d <= 20000)。這里N是計算機的數量,編號從1到N,D是兩臺計算機可以直接通信的最大距離。在接下來的N行中,每行包含兩個整數xi,yi(0 <= xi,yi <= 10000),這是N臺計算機的坐標。從第(N + 1)行到輸入結束,有一些操作,這些操作是一個接一個地執行的。每行包含以下兩種格式之一的操作:?
1。“O p”(1 <= p <= N),表示修復計算機p。?
2.“S p q”(1 <= p,q <= N),這意味著測試計算機p和q是否可以通信。?

輸入不會超過300000行。?

產量

對于每個測試操作,如果兩臺計算機可以通信則打印“SUCCESS”,否則打印“FAIL”。

樣本輸入

4 1
0 1
0 2
0 3
0 4
O 1
O 2
O 4
S 1 4
O 3
S 1 4

樣本輸出

FAIL
SUCCESS

?思路:對每次修好的電腦對其它已經修好的電腦遍歷,如果距離小于等于最大通信距離就將他們合并。

注意

  1、坐標之后給出的計算機編號都是n+1的。例如O 3,他實際上修理的是編號為2的計算機,因為計算機是從0開始編號的。

  2、比較距離的時候注意要用浮點數比較,否則會WA。

  3、"FAIL"不要寫成"FALL"。

  4、字符串輸入的時候注意處理好回車,空格等情況。

  5、注意N的范圍(1 <= N <= 1001),最大是1001,不是1000。是個小坑,數組開小了可能會錯哦。

?

#include <iostream>
#include <stdio.h>
#include <cmath>
using namespace std;#define MAXN 1010int dx[MAXN],dy[MAXN];    //坐標
int par[MAXN];    //x的父節點
int repair[MAXN] ={0};
int n;void Init()//初始化
{int i;for(i=0;i<=n;i++)par[i] = i;
}int Find(int x)//尋根
{if(par[x]!=x)par[x] = Find(par[x]);return par[x];
}void Union(int x,int y)//合并
{par[Find(x)] = Find(y);
}int Abs(int n)//絕對值
{return n>0?n:-n;
}double Dis(int a,int b)//坐標
{return sqrt( double(dx[a]-dx[b])*(dx[a]-dx[b]) + (dy[a]-dy[b])*(dy[a]-dy[b]) );
}int main()
{int d,i;//初始化scanf("%d%d",&n,&d);Init();//輸入坐標for(i=0;i<n;i++){scanf("%d%d",&dx[i],&dy[i]);}//操作char cmd[2];int p,q,len=0;while(scanf("%s",cmd)!=EOF){switch(cmd[0]){case 'O':scanf("%d",&p);p--;repair[len++] = p;for(i=0;i<len-1;i++)    //遍歷所有修過的計算機,看能否聯通if( repair[i]!=p && Dis(repair[i],p)<=double(d) )Union(repair[i],p);break;case 'S':scanf("%d%d",&p,&q);p--,q--;if(Find(p)==Find(q))    //判斷printf("SUCCESS\n");else printf("FAIL\n");default:break;}}return 0;
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445601.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445601.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445601.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java設計模式(2 / 23):觀察者模式

定義 觀察者&#xff08;Observer&#xff09;模式定義了對象之間的一對多依賴&#xff0c;這樣一來&#xff0c;當一個對象改變狀態時&#xff0c;它的所有依賴者都會收到通知并自動更新。 OO設計原則&#xff1a;為了交互對象之間的松耦合設計而努力。 案例&#xff1a;氣…

二叉樹概述

各種實現和應用以后放鏈接 一、二叉樹的基本概念 二叉樹&#xff1a;二叉樹是每個節點最多有兩個子樹的樹結構。 根節點&#xff1a;一棵樹最上面的節點稱為根節點。 父節點、子節點&#xff1a;如果一個節點下面連接多個節點&#xff0c;那么該節點稱為父節點&#xff0c;它…

Java設計模式(1 / 23):策略模式

定義 策略&#xff08;Strategy&#xff09;模式定義了算法族&#xff0c;分別封裝起來&#xff0c;讓它們之間可以互相替換 &#xff0c;此模式讓算法的變化獨立于使用算法的客戶。 案例&#xff1a;模擬鴨子應用 一開始 新需求&#xff1a;模擬程序需要會飛的鴨子 在父類新…

Java設計模式(3 / 23):裝飾者模式

文章目錄定義案例1&#xff1a;三點幾啦首次嘗試再次嘗試設計原則&#xff1a;類應該對擴展開放&#xff0c;對修改關閉嘗用裝飾者模式裝飾者模式特征本例的類圖放碼過來飲料類HouseBlendDarkRoastEspressoDecaf調料裝飾類MilkMochaSoyWhip運行測試類案例2&#xff1a;編寫自己…

c語言知識體系

原文&#xff1a;https://blog.csdn.net/lf_2016/article/details/80126296#comments

《游戲編程入門 4th》筆記(1 / 14):Windows初步

文章目錄Windows編程概述獲取Windows理解Windows消息機制多任務多線程事件處理DirectX快速概覽Direct3D是什么Window程序基礎創建第一個Win32項目理解WinMainWinMain函數調用完整的WinMainGetMessage函數調用尋求幫助Windows編程概述 DirectX&#xff0c;流行的游戲編程庫。它…

17校招真題題集(1)1-5

注&#xff1a;本系列題目全是按照通過率降序來排列的&#xff0c;基本保證題目難度遞增。 1、 題目名稱&#xff1a;游戲任務標記 來源&#xff1a;騰訊 題目描述 游戲里面有很多各式各樣的任務&#xff0c;其中有一種任務玩家只能做一次&#xff0c;這類任務一共有1024個…

《游戲編程入門 4th》筆記(2 / 14):監聽Windows消息

文章目錄編寫一個Windows程序理解InitInstanceInitInstance函數調用InitInstance的結構理解MyRegisterClassMyRegisterClass函數調用MyRegisterClass的作用揭露WinProc的秘密WinProc函數調用WinProc的大秘密什么是游戲循環The Old WinMain對持續性的需要實時終止器WinMain和循環…

17校招真題題集(2)6-10

注&#xff1a;本系列題目全是按照通過率降序來排列的&#xff0c;基本保證題目難度遞增。 6、 題目名稱&#xff1a;Fibonacci數列 來源&#xff1a;網易 題目描述 Fibonacci數列是這樣定義的&#xff1a; F[0] 0 F[1] 1 for each i ≥ 2: F[i] F[i-1] F[i-2] 因此&am…

QT5的數據庫

#include <QtSql> QT sql QSqlDatabase類實現了數據庫連接的操作 QSqlQuery類執行SQL語句 QSqlRecord類封裝數據庫所有記錄 QSqlDatabase類 [cpp] view plaincopy print?QSqlDatabase db QSqlDatabase::addDatabase("QOCI"); db.setHostName("localh…

數據結構課上筆記6

本節課介紹了單鏈表的操作實現細節&#xff0c;介紹了靜態鏈表。 鏈表帶頭的作用&#xff1a;對鏈表進行操作時&#xff0c;可以對空表、非空表的情況以及 對首元結點進行統一處理&#xff0c;編程更方便。 下面給出帶頭的單鏈表實現思路&#xff1a; 按下標查找&#xff1a; …

《Unity2018入門與實戰》筆記(9 / 9):個人總結

個人總結 腳本語言學習的竅門 盡可能多讀、多寫、多說腳本語言&#xff01; Link 游戲制作步驟 設計游戲時一般會遵循5個步驟&#xff1a; 羅列出畫面上所有的對象。確定游戲對象運行需要哪些控制器腳本。確定自動生成游戲對象需要哪些生成器腳本。準備好用于更新UI的調度…

17校招真題題集(3)11-15

注&#xff1a;本系列題目全是按照通過率降序來排列的&#xff0c;基本保證題目難度遞增。 11、 題目名稱&#xff1a;買蘋果 來源&#xff1a;網易 題目描述 小易去附近的商店買蘋果&#xff0c;奸詐的商販使用了捆綁交易&#xff0c;只提供6個每袋和8個每袋的包裝(包裝不…

Qt學習:QDomDocument

QDomDocument類代表了一個XML文件 QDomDocument類代表整個的XML文件。概念上講&#xff1a;它是文檔樹的根節點&#xff0c;并提供了文檔數據的基本訪問方法。由于元素、文本節點、注釋、指令執行等等不可能脫離一個文檔的上下文&#xff0c;所以文檔類也包含了需要用來創建這些…

《事實:用數據思考,避免情緒化決策》筆記

文章目錄一分為二負面思維直線思維恐懼本能規模錯覺以偏概全命中注定單一視角歸咎他人情急生亂一分為二 要做到實事求是&#xff0c; 就要做到當你聽到一分為二的說法時&#xff0c; 你就能迅速認識到這種說法描述的是一種兩極分化的圖畫&#xff0c; 而兩極之間存在一道巨大的…

順序存儲線性表實現

在計算機中用一組地址連續的存儲單元依次存儲線性表的各個數據元素,稱作線性表的順序存儲結構。 順序存儲結構的主要優點是節省存儲空間&#xff0c;因為分配給數據的存儲單元全用存放結點的數據&#xff08;不考慮c/c語言中數組需指定大小的情況&#xff09;&#xff0c;結點之…

QT5生成.exe文件時,出現缺少QT5core.dll文件解決方法

在 http://qt-project.org/downloads 下載Qt SDK安裝需要Qt版本。在QtCreator下&#xff0c;程序可以正常運行&#xff0c;但是當關閉QtCreator后&#xff0c;在DeBug目錄下再運行相應的*.exe程序時&#xff0c;會提示缺少Qt5Core.dll錯誤。解決方法&#xff1a;添加電腦環境變…

《基于Java實現的遺傳算法》筆記(7 / 7):個人總結

文章目錄為何采用遺傳算法哪些問題適合用遺傳算法解決遺傳算法基本術語一般遺傳算法的過程基本遺傳算法的偽代碼為何采用遺傳算法 遺傳算法是機器學習的子集。在實踐中&#xff0c;遺傳算法通常不是用來解決單一的、特定問題的最好算法。對任何一個問題&#xff0c;幾乎總有更…

單鏈表不帶頭標準c語言實現

鏈表是一種物理存儲單元上非連續、非順序的存儲結構&#xff0c;數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。鏈表由一系列結點&#xff08;鏈表中每一個元素稱為結點&#xff09;組成&#xff0c;結點可以在運行時動態生成。每個結點包括兩個部分&#xff1a;一個是…

Java設計模式(4 / 23):單例模式

文章目錄單例模式的應用場景餓漢式單例模式懶漢式單例模式改進&#xff1a;synchronized改進&#xff1a;雙重檢查鎖改進&#xff1a;靜態內部類破壞單例用反射破壞單例用序列化破壞單例解密注冊式單例模式枚舉式單例模式解密容器式單例線程單例實現ThreadLocal單例模式小結參考…