【2018寒假集训Day 8】【最小生成树】Prim和Kruskal算法模板
2018-02-08 21:14
519 查看
Luogu最小生成树模板题
Prim
原理与dijkstra几乎相同,每次找最优的点,用这个点去松弛未连接的点,也就是用这个点去与未连接的点连接。
Kruskal
运用并查集,存储边,以权值为关键字进行排序,从小到大查看边,如果这条边的两个点不在同一集合内,就加入同一集合并压缩路径。
Prim
原理与dijkstra几乎相同,每次找最优的点,用这个点去松弛未连接的点,也就是用这个点去与未连接的点连接。
#include<cstdio> #include<vector> using namespace std; struct data { int to,val; }; vector<data> edge[200001]; int n,m,cost[5001],ans; bool visit[5001]; void add(int x,int y,int z) { data tmp; tmp.to=y; tmp.val=z; edge[x].push_back(tmp); } void init() { scanf("%d%d",&n,&m); int x,y,z; for (int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } } void First() { for (int i=1;i<=n;i++) cost[i]=0xfffffff; cost[1]=0; } void prim() { for (int i=1;i<=n;i++) { int mincost=0xfffffff; int mini=0; for (int j=1;j<=n;j++) if (mincost>cost[j]&&!visit[j]) mincost=cost[j],mini=j; visit[mini]=true; ans+=cost[mini]; for (int j=0;j<edge[mini].size();j++) if (!visit[edge[mini][j].to]&&cost[edge[mini][j].to]>edge[mini][j].val) cost[edge[mini][j].to]=edge[mini][j].val; } } int main() { init(); First(); prim(); printf("%d",ans); return 0; }
Kruskal
运用并查集,存储边,以权值为关键字进行排序,从小到大查看边,如果这条边的两个点不在同一集合内,就加入同一集合并压缩路径。
#include<cstdio> #include<algorithm> #include<vector> using namespace std; struct data { int str,to,val; }edge[200001]; int n,m,father[5001],ans,cnt; bool comp(data a,data b) { return a.val<b.val; } void init() { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { scanf("%d%d%d",&edge[i].str,&edge[i].to,&edge[i].val); } } int getfather(int v) { if (father[v]!=v) father[v]=getfather(father[v]); return father[v]; } void hb(int x,int y) { x=getfather(x); y=getfather(y); father[x]=y; } bool check(int a,int b) { a=getfather(a); b=getfather(b); if (a==b) return true; return false; } int main() { init(); for (int i=0;i<=n;i++) father[i]=i; sort(edge+1,edge+1+m,comp); for (int i=1;i<=m;i++) { if (!check(edge[i].str,edge[i].to)) { hb(edge[i].str,edge[i].to); ans+=edge[i].val; cnt++; } } if (cnt<n-1) printf("orz"); else printf("%d",ans); return 0; }
相关文章推荐
- 【2018寒假集训Day 7】【最短路径】三种算法的模板
- 【2018寒假集训Day 1】【位运算】生成字符串
- 【2018寒假集训Day 8】【并查集】并查集模板
- 【20171006】2017暑假北京学习 day 4 - 2 最小生成树、prim、Kruskal算法简述及其扩展
- Agri-Net(最小生成树模板 prim)
- 【模板】【最小生成树】【Prim】CODEVS P1078
- 最小生成树算法——Prim和Kruskal算法的实现
- 最小生成树的两种算法:Prim和Kruskal算法
- 《算法4》最小生成树之Prim与Kruskal算法
- 最小生成树Prim模板
- HDU 2682 Tree 最小生成树 prim模板
- hiho一下 第二十九周 最小生成树三·堆优化的Prim算法【14年寒假弄了好长时间没搞懂的prim优化:prim算法+堆优化 】
- Hihocoder #1098 : 最小生成树二·Kruskal算法 ( *【模板】 )
- 【模板】Prim+堆优化 最小生成树
- 寒假集训最小生成树专题
- 最小生成树(prim&kruskal)模板
- 最小生成树(Prim模板题)
- H - Agri-Net POJ - 1258 prim(最小生成树)模板
- HDU 1233 还是畅通工程 最小生成树 Prim模板的应用
- 最小生成树模板【kruskal & prim】