1、 /inf 表无穷大 for (j = 0;j j +)/找出当前未在最小生成树中边权最小的顶点 if (!markj & disj matflagj) disj = matflagj; return sum; /返回边权总和prim算法(边表形式):struct Edge/frm为起点,to为终点,w为边权,nxt指向下一个顶点 / int frm; int to,w,nxt;edgeM;int visM,headM,disM;void addedge (int cu,int cv,int cw)/生成边的函数 /edgee.frm = cu; edgee.to = cv; edgee.w
2、= cw; edgee.nxt = headcu; headcu = e +; /edgee.frm = cv; edgee.to = cu; edgee.nxt = headcv; headcv = e +;int prim(int n,int sta) /n为顶点数量,sta为起点 int sum = 0; memset(dis,0x3f,sizeof(dis); memset(vis,0,sizeof(vis); for (i = headsta;i != -1;i = edgei.nxt)/遍历与sta点相连的所有顶点 int v = edgei.to; disv = edgei.w;
3、 vissta = 1; /加入到最小生成树中 int m = n - 1; /只生成n-1条边,所以循环n-1次 while (m -)i +)/找出当前边权最小的边visi&disi flag = i,min = disi; visflag = 1;/加入到最小生成树中 for (i = headflag;i = edgei.nxt) /更新与flag顶点相连的点的dis if (edgei.w disv)int main () e = 0; /记得初始化 memset (head,-1,sizeof(head); scanf (%d %d %d,&a,&b,&w); addedge(a,
4、b,w); . prim(n,sta); return 0;Kruskal算法:struct Edge int v1,v2,w;edgeM,treeM; /w为v1顶点到v2顶点的边权/ *int Find (int parent,int u)/第1种写法 int tmp = u; while (parentmp != -1) tmp = parenttmp; return tmp;*/int Find (int u) /第2种写法 if (u != parentu) parentu = Find(parenu); return parentu;bool cmp (Edge a,Edge b)
5、 return a.w b.w;int Kruskal()/parent表示集合 int parentM; int i,j,sum,vf1,vf2; sort(edge,edge+E,cmp); / memset (parent,-1,sizeof(parent);/对应第1种并查集的初始化/对应第2种并查集的初始化 parenti = i; sum = i = j = 0; while (i E & j N - 1)/生成的边数为N-1 vf1 = Find(parent,edgei.v1); /找这两个点的祖先 vf2 = Find(parent,edgei.v2); if (vf1 !=
6、 vf2) /若两个点的祖先不同,说明不在同一集合 parentvf2 = vf1;/把vf2点加到vf1点的集合中 treej+ = edgei;/把边加到tree数组中,这句题目没要求可忽略之 sum += edgei.w; /sum 加上其边权 i +;最小生成树 - Kruskal算法:运用数组存点与边的权值#include stdlib.halgorithm#define N 150using namespace std;int m,n,uN,vN,wN,pN,rN;int cmp(const int i,const int j) return wiwj;int find(int x
7、) return px=x?x:px=find(px);int kruskal() int cou=0,x,y,i,ans=0; for(i=0;in;i+) pi=i;m;i+) ri=i; sort(r,r+m,cmp);i+) int e=ri;x=find(ue);y=find(ve); if(x!=y) ans += we;px=y;cou+; if(coun-1) ans=0; return ans; int main() int i,ans; while(scanf(%d%dm,&n)!=EOF&m) scanf(%d%d%dui,&vi,&wi); ans=kruskal();
8、 if(ans) printf(%dn,ans); else printf(?n2.最短路算法DIJKC+代码 1.#defineinf0x3fffffff2.#defineM1053.4.intdistM,mapMM,5.boolmarkM;6.7.voidinit()8.9.inti,j;10.for(i=1;ii+)/i=j的时候也可以初始化为0,只是有时候不合适11.(jjj+)12.mapijinf;13.14.15.voiddijk(intu)16.17.j,mins,v;18.19.20.distimapui;21.markifalse;22.23.markutrue;24.distu0;/既然上面的map当i=j时不是0,就要这句25.while(1)26.27.mins28.29.if(!markjdistjmins)30.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1