===Dijkstra===
int vis[N],dis[N];//vis标记 dis路程
int near[N],to[N];
void dijkstra(int n){
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++) dis[i]=map[0][i];
dis[0]=0;vis[0]=1;
for(int i=1;i<=n;i++){
int x,m=INF;
for(int j=1;j<=n;j++){
if(!vis[j]&&dis[j]<=m){
m=dis[j];
x=j;
}
}
vis[x]=1;
for(int j=1;j<=n;j++){
if(!vis[j]){
dis[j]=min(dis[j],dis[x]+map[x][j]);
}
}
}
}
===并查集===
int pre[N];
int find(int i){
return pre[i]==i?i:pre[i]=find(pre[i]);
}
bool join(int a,int b){
int fa=find(a);
int fb=find(b);
if(fa!=fb){
pre[fa]=fb;
return 1;
}
return 0;
}
===Kruskal===
struct edge{
int u,v,w;
}edges[N];
int pre[N];
int find(int i){
return pre[i]==i?i:pre[i]=find(pre[i]);
}
int cmp(edge a,edge b){
return a.w<b.w;
}
int kruskal(int n,int m){
int ans=0,cnt=1;
for(int i=1;i<=n;i++) pre[i]=i;
sort(edges+1,edges+m+1,cmp);
for(int i=1;i<=m;i++){
int x=find(edges[i].u);
int y=find(edges[i].v);
if(x!=y){
ans+=edges[i].w;
pre[x]=y;
cnt++;
}
}
if(cnt==m) return ans;
else return -1;
}