Kruakal算法

来源:互联网 发布:局域网直播软件 编辑:程序博客网 时间:2024/05/09 00:37

kruskal只与边有关,适合用于稀疏图。prim算法只与点有关,适合点比较少的稠密图。

kruskal算法复杂度是O(ElnV)

#include "stdio.h"#include<string> #include<algorithm> using namespace std;const int INF=999999;const int MaxV=1000;//primint lowcost[MaxV];int matrix[MaxV][MaxV];bool visit[MaxV];//kruskalint sum,nodeNum,edgeNum;int root[MaxV];int heavy[MaxV];struct Edge{int u;int v;int value;}edge[MaxV];bool cmp(const Edge & a,const Edge & b){return a.value<b.value;}void prim(){int i , j , u , temp;memset(visit , false,sizeof(visit));for(i=1;i<=nodeNum;i++)lowcost[i]=matrix[1][i];visit[1]=true;for(i=1;i<=nodeNum;i++){temp=INF;for(j=1;j<=nodeNum;j++)if(!visit[j]&&temp>lowcost[j]){temp = lowcost[j];u = j;}visit[u]=true;if(temp==INF)break;sum+=temp;for(j=1;j<=nodeNum;j++)if(!visit[j]&&lowcost[j]>matrix[u][j])lowcost[j]=matrix[u][j];}}int findRoot(int i){return root[i]==i?i:findRoot(root[i]);}bool join(int x,int y){int root1 = findRoot(x);int root2 = findRoot(y);if(root1==root2) return false;if(heavy[root1]>=heavy[root2]){root[root2]=root1;heavy[root1]+=heavy[root2];}else{root[root1]=root2;heavy[root2]+=heavy[root1];}return true;}int main(){FILE *fp = freopen("data.txt","r",stdin);int i,edgeTotal;while(scanf("%d%d",&nodeNum,&edgeNum)!=EOF){for(i=1;i<=edgeNum;i++){root[i]=i;heavy[i]=i;}for(i=1;i<=edgeNum;i++){scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].value);}sort(edge+1,edge+1+edgeNum,cmp);edgeTotal = 0;for(i=1;i<=edgeNum;i++){if(join(edge[i].u,edge[i].v)){sum+=edge[i].value;++edgeTotal;//printf("%d->%d:%d\n",edge[i].u , edge[i].v,edge[i].value);}if(edgeTotal==nodeNum-1)break;}if(edgeTotal==nodeNum-1)printf("%d\n",sum);elseprintf("no MST/n");}return 0;}


原创粉丝点击