int g[N][N], dist[N];//g[i][j]表示点ij的距离,dist记录每个点与集合之间的距离
bool st[N];//记录点是否已经纳入集合int res;//记录最小生成树的权重和
bool prim(){memset(dist,0x3f,sizeof(dist));//初始化所有点到集合的距离为无穷for(int i =0; i < n; i ++)//n轮迭代,每一次寻找一个不在集合中,距离集合最近的点{int t =-1;for(int j =1; j <= n; j ++){if(!st[j]&&(t ==-1|| dist[j]< dist[t])){
t = j;}}if(i && dist[t]== INF)return false;//此时表明图并不联通if(i){
res += dist[t];//cout << 1 << endl;}//用t到j的距离更新j到集合的距离for(int j =1; j <= n; j ++) dist[j]=min(dist[j], g[t][j]);
st[t]= true;}return true;}
Kruskal算法模板
structnode{int u, v, w;
bool operator<(conststructnode& t)const{return w < t.w;}}Edges[N];//将所有的边进行排序sort(Edges, Edges + m);//依次枚举每一条边for(int i =0; i < m; i ++){int u = Edges[i].u, v = Edges[i].v, w = Edges[i].w;int a =find(u);//使用并查集寻找集合名称int b =find(v);//该边不在集合内,将边纳入集合if(a != b){
p[a]= b;
res += w;//加上权重
cnt ++;}}if(cnt < n -1)puts("impossible");//存在不连通的情况