今天学了并查集,总结一下:
并查集的最本质应用是将属于同一类的事物并在同一集合,这样有几个集合就有几类事物了,并和查是在一起进行的。下面是代码模型
#include <stdio.h>
#include <stdlib.h>
#define Max 101
int set[Max];
int find(int x);
int n,m;
int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
int i;
for(i=1;i<=n;i++)
set[i]=i;
int a,b,x,y;
for(i=0;i<m;i++){
scanf("%d%d",&a,&b);
x=find(a);
y=find(b);
if(x!=y)
set[x]=y;
}
int ans=0;
for(i=1;i<=n;i++)
if(set[i]!=i)
ans++;
printf("%d\n",ans);
}
return 0;
}
int find(int x){
if(set[x]==x)
return x;
return find(set[x]);
}
那么并查集最典型的应用就是最小生成树了,下面是代码模型:
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#define Max 101 //n-----max
#define maxn 100010//m-----max
using namespace std;
struct Por{
int a;
int b;
int v;
}node[maxn];
int set[Max];
int cmp(const Por p,const Por q);
int find(int x);
bool Merge(int x,int y);
int n,m,ans;
int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
int i;
for(i=1;i<=n;i++)
set[i]=i;
for(i=0;i<m;i++)
scanf("%d%d%d",&node[i].a,&node[i].b,&node[i].v);
sort(node,node+m,cmp);
ans=0;
for(i=0;i<m;i++){
if(Merge(node[i].a,node[i].b))
ans+=node[i].v;
}
printf("%d\n",ans);
}
return 0;
}
int find(int x){
if(x==set[x])
return x;
return find(set[x]);
}
bool Merge(int x,int y){
int a=find(x);
int b=find(y);
if(a!=b){
set[a]=b;
return true;
}
return false;
}
int cmp(const Por p,const Por q){
return p.v-q.v;
}
- 上一篇:二部图总结