并查集模板–C语言
#include <stdio.h>
void Initial(int S[],int size){
for(int i=0;i<size;i++){
S[i]=-1;
}
}
int Find(int S[],int x){
int root=x;
while(S[root]>=0) root=S[root];
while(x!=root){
int t=S[x];
S[x]=root;
x=t;
}
return root;
}
void Union(int S[],int Root1,int Root2){
Root1=Find(S,Root1);
Root2=Find(S,Root2);
if(Root1==Root2) return;
if(S[Root2]>=S[Root1]){
S[Root1]+=S[Root2];
S[Root2]=Root1;
}else{
S[Root2]+=S[Root1];
S[Root1]=Root2;
}
}
并查集例题一:岛屿数量
Leecode第200道题
int count;
void Initial(int S[],int size){
for(int i=0;i<size;i++){
S[i]=-1;
}
}
int Find(int S[],int x){
int root=x;
while(S[root]>=0) root=S[root];
while(x!=root){
int t=S[x];
S[x]=root;
x=t;
}
return root;
}
void Union(int S[],int Root1,int Root2){
Root1=Find(S,Root1);
Root2=Find(S,Root2);
if(Root1==Root2) return;
if(S[Root2]>=S[Root1]){
S[Root1]+=S[Root2];
S[Root2]=Root1;
}else{
S[Root2]+=S[Root1];
S[Root1]=Root2;
}
--count;
}
int numIslands(char** grid, int gridSize, int* gridColSize){
int colSize=gridColSize[0];
int size=colSize*gridSize;
count=0;
int UFSets[size];
Initial(UFSets,size);
for(int i=0;i<gridSize;i++){
for(int j=0;j<colSize;j++){
if(grid[i][j]=='1'){
++count;
grid[i][j]=='0';
int root1;
int root2;
if(i-1>=0&&grid[i-1][j]=='1'){
root1=(i-1)*colSize+j;
root2=i*colSize+j;
}
if(j-1>=0&&grid[i][j-1]=='1'){
root1=i*colSize+j-1;
root2=i*colSize+j;
}
if(i+1<gridSize&&grid[i+1][j]=='1'){
root1=(i+1)*colSize+j;
root2=i*colSize+j;
}
if(j+1<colSize&&grid[i][j+1]=='1'){
root1=i*colSize+j+1;
root2=i*colSize+j;
}
Union(UFSets,root1,root2);
}
}
}
return count;
}
并查集例题二:无向图的连通性
#include <stdio.h>
#include<stdlib.h>
void Initial(int S[],int size){
for(int i=0;i<size;i++){
S[i]=-1;
}
}
int Find(int S[],int x){
int root=x;
while(S[root]>-1) root=S[root];
while(x!=root){
int parent=S[x];
S[x]=root;
x=parent;
}
return root;
}
bool Union(int S[],int root1,int root2){
root1=Find(S,root1);
root2=Find(S,root2);
if(root1==root2) return false;
if(S[root1]<=S[root2]){
S[root1]+=S[root2];
S[root2]=root1;
}else{
S[root2]+=S[root1];
S[root1]=root2;
}
return true;
}
bool graphIsCircle(int** graph,int row,int col){
int UFsets[row];
Initial(UFsets,row);
for(int i=0;i<row;i++){
for(int j=i+1;j<col;j++){
if(graph[i][j]==1&&!Union(UFsets,i,j)){
return false;
}
}
}
return true;
}
int main(){
int row=4;
int col=4;
int** graph=(int **)malloc(sizeof(int *)*row);
for(int i=0;i<row;i++){
graph[i]=(int *)malloc(sizeof(int)*col);
}
graph[0][0]=0;
graph[0][1]=1;
graph[0][2]=0;
graph[0][3]=1;
graph[1][0]=1;
graph[1][1]=0;
graph[1][2]=1;
graph[1][3]=0;
graph[2][0]=0;
graph[2][1]=1;
graph[2][2]=0;
graph[2][3]=1;
graph[3][0]=0;
graph[3][1]=0;
graph[3][2]=1;
graph[3][3]=0;
printf("图是否成环: %d",graphIsCircle(graph,row,col));
}