prim && kruskal

传送门 :安慰奶牛

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstdlib>
 5
 6 using namespace std;
 7
 8 struct node{
 9     int x,y,w;
10 };
11
12 node s[100010];//边
13 int sum;//记录最小时间
14 int f[10010];//表示各个顶点在不同的连通分量上。 (即所属父亲)
15 int talk[10010];// 记录 每个牧场的谈话时间
16
17 void init()//初始化
18 {
19     int i;
20     for(i=0;i<10010;i++)
21         f[i]=i;
22 }
23
24 int cmp(node a,node b) //排序,从小到大
25 {
26     return a.w<b.w;
27 }
28
29 void kruscal(int n,int l)//kruscal 入口
30 {
31     int q;
32     sort(s,s+l,cmp);
33     int num=1,j;  //记录边的个数
34     int k=0;//循环边的下标
35     while(num<n)
36     {
37         if(f[s[k].x]!=f[s[k].y]) //判断这条边是否构成回路
38         {
39             num++;
40             sum+=s[k].w;
41             q=f[s[k].y];
42             for(j=1;j<=n;j++)//循环每个和q相等的顶点父亲 .
43             {
44                 if(f[j]==q)    f[j]=f[s[k].x];
45             }
46         }
47         k++;//循环每条边
48     }
49 }
50 int main()
51 {
52
53     int n,p,i;
54     while(~scanf("%d%d",&n,&p))
55     {
56         init();
57         sum=0;
58         int min=99999;
59         for(i=1;i<=n;i++)//找最小的顶点,从这一点出发
60         {
61             scanf("%d",&talk[i]);
62             if(min>talk[i])    min=talk[i];
63         }
64         for(i=0;i<p;i++)//构造可以生成最小树的连通图。
65         {
66             scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].w);
67             s[i].w=talk[s[i].x]+talk[s[i].y]+2*s[i].w;
68         }
69         kruscal(n,p);
70         printf("%d\n",sum+min);
71         //for(i=1;i<=n;i++) 最小生成树的顶点最后成为一个连通图,即f[i]都相等
72         //    cout << f[i]<<endl;
73     }
74 }

kruskal解答

时间: 2024-10-13 06:52:20

prim && kruskal的相关文章

poj1861 最小生成树 prim &amp; kruskal

// poj1861 最小生成树 prim & kruskal // // 一个水题,为的只是回味一下模板,日后好有个照应不是 #include <cstdio> #include <algorithm> #include <cstring> #include <vector> #include <iostream> using namespace std; const int MAX_N = 1008; const int INF =

最小生成树详解 prim+ kruskal代码模板

最小生成树概念: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出.最小生成树其实是最小权重生成树的简称. prim: 概念:普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小. 实现过程: 图例 说明 不可选 可选 已选(Vn

hdu 1162 Eddy&#39;s picture 最小生成树入门题 Prim+Kruskal两种算法AC

Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7428    Accepted Submission(s): 3770 Problem Description Eddy begins to like painting pictures recently ,he is sure of himself to

【图论】畅通道路 prim Kruskal

最近在整理图论的算法.并且做了一些基础的题来练习,现在做一个总结,然后准备进入下一类算法的复习. 算法这个东西,就是不要害怕去编,哪怕自己只是有一点点理解,有好多点的模糊, 找一道基础的题, 对应着有一种思路解答的,去学习代码,学习里面的思路,并且自己动手跟着敲一敲,慢慢的就会理解了.    不用想着一开始就能够很彻底的理解算法的细节上思想. 理解的时候,从它所要达到的目的去思考, 知道它是要做一个什么事情,这是第一步.后面慢慢的多去练,就会更加深刻的理解里面的思想了,包括细节部分, 也会一点一

最小生成树算法详解(prim+kruskal)

最小生成树概念: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出.最小生成树其实是最小权重生成树的简称. prim: 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小. p

最小生成树求法 Prim + Kruskal

prim算法的思路 和dijkstra是一样的 每次选取一个最近的点 然后去向新的节点扩张 注意这里的扩张 不再是 以前求最短路时候的到新的节点的最短距离 而是因为要生成一棵树 所以是要连一根最短的连枝 所以关键部分修改一下 dist[u] = min(dist[u], e.cost) --->>e是连接 v 和 u的边 同样地 普同写法O(v^2) 用队列优化后O(E*logV) 1 #include <iostream> 2 #include <stdio.h> 3

hdu 1233 还是畅通工程(prim||kruskal)

这个完完全全就是模板题目,没有一点变化,就是单纯的让求最小生成树 代码:(prim) #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<vector> #include<set> #include<queue> #include<string> #inclu

HDU 1233 prim kruskal最小生成树模板题

A - 还是畅通工程 Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小.请计算最小的公路总长度. Input 测试输入包含若干测试

最小生成树(prim&amp;kruskal)

最近都是图,为了防止几次记不住,先把自己理解的写下来,有问题继续改.先把算法过程记下来: prime算法:                                           原始的加权连通图——————D被选作起点,选与之相连的权值最小的边————选与D.A相连权值最小的边——————可选的有B(7).E(8).G(11)                   ————————————————————————————————————————————————————————————

hdu 3371 Connect the Cities Prim + Kruskal两种算法分别AC 水过~~~~

Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11727    Accepted Submission(s): 3278 Problem Description In 2100, since the sea level rise, most of the cities disappear. Tho