并查集
int find(int x){ //查 查找根节点
int r=x;
while(r!=pre[r])
r=pre[r];
int i=x,j; //压缩路径
while(i!=r){
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
void join(int x,int y){ //并
int fx=find(x);
int fy=find(y);
if(fx!=fy)
pre[fx]=fy;
}
最小生成树(Kruskal算法 模板)
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int pre[10000];
int n;
void init(){
for(int i=0;i<n;i++)
pre[i]=i;
}
struct ak{
int s,c,l;
}a[10000];
int cmp(ak x,ak y){
return x.l<y.l;
}
int find(int x){ //查 查找根节点
int r=x;
while(r!=pre[r])
r=pre[r];
int i=x,j; // -
while(i!=r){ // |
j=pre[i]; // |
pre[i]=r; // |-压缩路径
i=j; // |
} // -
return r;
}
void join(int x,int y){ //并
int fx=find(x);
int fy=find(y);
if(fx!=fy)
pre[fx]=fy;
}
int main(){
while(...){
...
init();
sort(a,a+n,cmp);
...
}
return 0;
}