最小生成树(Kruska、Prim)
来源:互联网 发布:淘宝提醒发货有用吗 编辑:程序博客网 时间:2024/05/16 01:03
Kruska:
将所有边从小到大加入,在此过程中 判断是否构成回路
– 使用数据结构:并查集
– 时间复杂度:O(ElogE)
– 适用于稀疏
Prim:
从任一节点出发,不断扩展
– 使用数据结构:堆
– 时间复杂度:O(ElogV) 或 O(VlogV+E)(斐波那契堆)
– 适用于密集图
– 若不用堆则时间复杂度为O(V2)
将所有边从小到大加入,在此过程中 判断是否构成回路
– 使用数据结构:并查集
– 时间复杂度:O(ElogE)
– 适用于稀疏
堆(结构体优先队列)
http://acm.hdu.edu.cn/showproblem.php?pid=1233
#include<bits/stdc++.h>using namespace std;const int N=1e3;struct node{ int x,y,val; node(){} node(int a,int b,int c){x=a;y=b;val=c;} bool operator <(const node &xx)const { return xx.val<val; }};int pre[N];int finds(int x){ return x==pre[x]?x:pre[x]=finds(pre[x]);}bool bing(int x,int y){ x=finds(x); y=finds(y); if(x!=y) {pre[x]=y;return 1;} return 0;}int main(){ int i,j,t,tt=0; int n,m; while(~scanf("%d",&n),n) { for(i=0;i<=n;i++) pre[i]=i; m=(n-1)*n/2; priority_queue<node> q; while(!q.empty()) q.pop(); while(m--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); q.push(node(a,b,c)); } int ans=0; while(!q.empty()) { node g=q.top();q.pop(); if(bing(g.x,g.y)) ans+=g.val; } printf("%d\n",ans); }}sort(快排)
#include<bits/stdc++.h>using namespace std;const int N=1e2;struct node{ int x,y,val; node(){} node(int a,int b,int c){x=a;y=b;val=c;}}g[5000];bool cmp(node xx,node yy){ return xx.val<yy.val;}int pre[N];int finds(int x){ return x==pre[x]?x:pre[x]=finds(pre[x]);}bool bing(int x,int y){ x=finds(x); y=finds(y); if(x!=y) {pre[x]=y;return 1;} return 0;}int main(){ int i,j,t,tt=0; int n,m; while(~scanf("%d",&n),n) { for(i=0;i<=n;i++) pre[i]=i; m=(n-1)*n/2; for(i=0;i<m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); g[i]=(node(a,b,c)); } sort(g,g+m,cmp); int ans=0;n--; for(i=0;i<m,n;i++) if(bing(g[i].x,g[i].y)) ans+=g[i].val,n--; printf("%d\n",ans); }}
Prim:
从任一节点出发,不断扩展
– 使用数据结构:堆
– 时间复杂度:O(ElogV) 或 O(VlogV+E)(斐波那契堆)
– 适用于密集图
– 若不用堆则时间复杂度为O(V2)
未优化
#include<bits/stdc++.h>using namespace std;const int N=1e2+7;const int inf=0x3f3f3f3f;int mp[N][N],dis[N],used[N];int n;void prim(){ int i,j,pos,mi,sum=0; memset(used,0,sizeof used); memset(dis,inf,sizeof dis); pos=1;used[1]=1;dis[1]=0; for(i=2;i<=n;i++) { for(j=1;j<=n;j++) if(!used[j]&&dis[j]>mp[pos][j]) dis[j]=mp[pos][j]; mi=inf; for(j=1;j<=n;j++) if(!used[j]&&dis[j]<mi) mi=dis[pos=j]; used[pos]=1; sum+=mi; } cout<<sum<<endl;}int main(){ int i,j,t,tt=0; while(cin>>n,n) { memset(mp,0,sizeof mp); for(i=1;i<=n*(n-1)/2;i++) { int a,b,c; cin>>a>>b>>c; mp[a][b]=mp[b][a]=c; } prim(); } return 0;}
#include<bits/stdc++.h>using namespace std;const int N=2*1e2+7;const int inf=0x3f3f3f3f;struct node{ int x,val; node(){} node(int a,int b){x=a;val=b;} bool operator <(const node &xx)const { return val>xx.val; }};vector<node> g[N];int used[N],dis[N],n;void prim(){ int sum=0; priority_queue<node> q; memset(used,0,sizeof used); memset(dis,inf,sizeof dis); q.push(node(1,0)); while(!q.empty()) { node now=q.top();q.pop(); int x=now.x; if(used[x]) continue; used[x]=1; sum+=now.val; for(int i=0;i<g[x].size();i++) { int xx=g[x][i].x; int val=g[x][i].val; if(!used[xx]&&dis[xx]>val) q.push(node(xx,dis[xx]=val)); } } cout<<sum<<endl;}int main(){ int i,j,t,tt=0; while(cin>>n,n) { memset(g,0,sizeof g); for(i=0;i<n*(n-1)/2;i++) { int a,b,c; cin>>a>>b>>c; g[a].push_back(node(b,c)); g[b].push_back(node(a,c)); } prim(); } return 0;}
#include<bits/stdc++.h>using namespace std;const int N=2*1e2+7;const int inf=0x3f3f3f3f;struct node{ int to,val; node(){} node(int a,int b){to=a;val=b;} bool operator <(const node &xx)const { return val>xx.val; }};int mp[N][N];int used[N],dis[N],n;void prim(){ int sum=0; priority_queue<node> q; memset(used,0,sizeof used); memset(dis,inf,sizeof dis); q.push(node(1,0)); while(!q.empty()) { node now=q.top();q.pop(); int from=now.to; if(used[from]) continue; used[from]=1; sum+=now.val; for(int i=1;i<=n;i++) { int val=mp[from][i]; if(inf==val) continue; if(!used[i]&&dis[i]>val) q.push(node( i,dis[i]=val )); } } cout<<sum<<endl;}int main(){ int i,j,t,tt=0; while(cin>>n,n) { memset(mp,inf,sizeof mp); for(i=0;i<n*(n-1)/2;i++) { int a,b,c; cin>>a>>b>>c; mp[a][b]=mp[b][a]=c; } prim(); } return 0;}
0 0
- 最小生成树(Kruska、Prim)
- 最小生成树 Kruska算法
- [笔记]: 最小生成树Kruska
- 求无向连通图的最小生成树算法——Prim与Kruska
- 51nod 1212 无向图最小生成树(prim算法和kruska算法) 新手小结
- Out of Hay(Kruska算法求最小生成树l)
- 最小生成树(prim)
- 最小生成树(Prim)
- prim(最小生成树)
- 最小生成树(prim)
- 最小生成树(Prim)
- Prim最小生成树
- 最小生成树 prim
- 最小生成树 Prim
- 最小生成树-Prim
- Prim最小生成树
- 最小生成树 Prim
- prim最小生成树
- C语言 assert()函数
- js时钟代码
- POJ 3468 A Simple Problem with Integers 区间和更新,区间和查找
- QCA4010开发板的DEMO编译总结
- 无法打开cufft.lib文件以及无法解析cufft的相关的外部符号的解决方法
- 最小生成树(Kruska、Prim)
- POJ 3304 Segments
- 传送门:安卓各大网络请求库的对比
- IOS知识点回顾
- Intellij IDEA 的使用
- linux 主机的网络属性基本配置:
- Python机器学习库scikit-learn实践 多个机器学习算法同时比较精度 ~\(≧▽≦)/~
- 从BaseActivity与BaseFragment的封装谈起
- 数据结构实验之二叉树三:统计叶子数