Kruskal算法
来源:互联网 发布:影视制作软件下载 编辑:程序博客网 时间:2024/06/12 22:09
算法导论第23章第2节
#include<iostream>#include<cmath>using namespace std;struct node{node(int i,int j,int l):x(i),y(j),len(l){}int x;int y;int len;};int N,M;int u,v,l;node* length[1000];int p[1000];int cnt=0;int getGroup(int i){if(p[i]!=i)p[i]=getGroup(i);return ppos;}void Heapify(int pos){int l=pos*2;int r=pos*2+1;int min=pos;if(r<=cnt&&length[r]->len<length[min]->len)min=r;if(l<=cnt&&length[l]->len<length[min]->len)min=l;if(min!=pos){swap(length[min],length[pos]);Heapify(min);}}void insert(node* nd){int pos=++cnt;length[pos]=nd;int parent=floor(pos/2);while(parent>0&&length[parent]->len>length[pos]->len){swap(length[parent],length[pos]);pos=parent;parent=floor(pos/2);}}node* ExtractMin(){swap(length[1],length[cnt]);Heapify(1);return length[cnt--];}int main(){cin>>N>>M;int ans=0;for(int i=0;i<N;++i)p[i]=-1;for(int i=0;i<M;++i){cin>>u>>v>>l;node *nd=new node(u,v,l);insert(nd);}while(cnt>0){node* nd=ExtractMin();int x=nd->x,y=nd->y,len=nd->len;delete nd;nd=NULL;if(p[x]==-1&&p[y]==-1){p[x]=x;p[y]=x;ans+=len;}else if(p[x]!=-1&&p[y]!=-1){if(getGroup(x)!=getGroup(y)){p[getGroup(y)]=getGroup(x);ans+=len;}}else{int px=p[x]!=-1?x:y;int py=px==x?y:x;p[py]=getGroup(px);ans+=len;}}cout<<ans<<endl;return 0;}
0 0
- Kruskal算法
- Kruskal算法
- Kruskal算法
- kruskal算法
- Kruskal算法
- Kruskal算法
- Kruskal算法
- Kruskal算法
- kruskal算法
- kruskal算法
- kruskal算法
- Kruskal算法
- kruskal算法
- Kruskal算法
- Kruskal算法
- Kruskal算法
- Kruskal算法
- Kruskal算法
- Restore IP Addresses---medium
- 事件是在线程同步中最常用的一种同步对象,可手动自动状态。
- 开篇
- BLE协议栈之读取CC2541的MAC地址
- nyoj-664-数字整除
- Kruskal算法
- Eclipse 中 An error has occurred 错误
- Fraction to Recurring Decimal
- 通俗易懂的相对定位与绝对定位
- 搭建高可用mongodb集群(一)——配置mongodb
- Windows远程桌面连接命令mstsc收藏
- 【简化数据】奇异值分解(SVD)
- C语言修改注册表
- plsql developer 兼容64bit oracle 11g