來源:點擊開啟連結
看KMP看煩了,來一道並查集入門吧。並查集其實是一種簡單的資料結構,採用樹的方式儲存,數組中讀取的方式是通過父親節點來進行尋找,顧名思義,取該名的原因是因為可並可查。常用來解決一種求兩兩關係之間的總類數的模型,實現也十分美觀,沒有什麼難懂的地方。狀態壓縮也非常淺顯,待瞭解深入後可以小做總結以備忘之。
這個題是標準的並查集模板,結構清晰,基本都不用講,很快就可以自己練會。沒有狀態壓縮的並查集有個特點就是卡時間,所以盡量使用scanf,printf,題目也會給予透露的,畢竟時間充裕的問題暴個搜完全解決了。。
#include <iostream>#include <cstring>#include <stdio.h>using namespace std;int numpack[1005];int search_father(int num) //查 {int result=num;while(result!=numpack[result]){result=numpack[result];}return result;}void merge(int a,int b) //並 {int ka=search_father(a);int kb=search_father(b);if(ka!=kb){numpack[ka]=kb;}}int main(){int city,road;while(scanf("%d",&city)){if(city==0)return 0;else{scanf("%d",&road);}for(int i=1;i<=city;i++)//序號從1開始,WA了一次 {numpack[i]=i;}for(int j=1;j<=road;j++){int start,end;scanf("%d%d",&start,&end);merge(start,end);//並 }int count=0;for(int k=1;k<=city;k++){if(numpack[k]==k)count++;}printf("%d\n",count-1);}return 0;}