3366 【模板】最小生成树(Prim)

题目描述

如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz

输入输出格式

输入格式:

第一行包含两个整数N、M,表示该图共有N个结点和M条无向边。(N<=5000,M<=200000)

接下来M行每行包含三个整数Xi、Yi、Zi,表示有一条长度为Zi的无向边连接结点Xi、Yi

输出格式:

输出包含一个数,即最小生成树的各边的长度之和;如果该图不连通则输出orz

代码:

 1 #include<iostream>
 2 #include<vector>
 3 #include<queue>
 4 #include<algorithm>
 5 using namespace std;
 6 const int inf = 1<<30;
 7 int n, m;
 8 struct edge{
 9     int k, w;
10 };
11 bool operator<(const edge&e1, const edge&e2){
12     return e1.w > e2.w;
13 }
14 priority_queue<edge>pq;
15 vector<vector<edge> >v;
16 int d[5010];
17 bool used[5010];
18
19 int main(){
20     cin>>n>>m;
21     int i;
22     int donenum = 0;
23     v.clear();
24     v.resize(n+1);
25     edge p, p2;
26     for(i = 1; i <= m; i++){
27         int a, b, c;
28         cin>>a>>b>>c;
29         p.k = b;
30         p.w = c;
31         v[a].push_back(p);
32         p2.k = a;
33         p2.w = c;
34         v[b].push_back(p2);
35     }
36     for(i = 1; i <= n; i++) d[i] = inf;
37     p.k = 1;
38     p.w = 0;
39     int way = 0;
40     pq.push(p);
41     while(!pq.empty()&&donenum<n){
42         p = pq.top();
43         pq.pop();
44         if(used[p.k]) continue;
45         way += p.w; donenum++;
46         used[p.k] = true;
47         for(i = 0; i < v[p.k].size(); i++){
48             edge q;
49             q.k = v[p.k][i].k;
50             if(used[q.k]) continue;
51             q.w = v[p.k][i].w;
52             pq.push(q);
53         }
54     }
55     if(donenum<n) cout<<"orz";
56     else cout<<way;
57     return 0;
58 }

备注:

借着刚默写完一遍dijkstra的劲头,把Prim过了一遍。Prim跟dijkstra神似嘛,所以就想怎么把dijkstra改成Prim。因为gw的ppt上Prim的写法和dijkstra还是有些区别的。。

两个算法很小的区别已在代码中标出。最开始我特别nc,以为在pop后把p.w的值加起来就行了,实际上,p.w是每个点到源点的距离,而不是到最小生成树的距离,所以当然不能这么加。

要改的关键就是要记录下来每个点到最小生成树的距离,而不是到源点的距离。所以实际上只要改标黄那三行就可以了!ps:我是写着写着才突然发现实际上就是把dijkstra的q.w = p.w + v[p.k][i].w改成q.w = v[p.k][i].w就行了。

看来对dijkstra的深刻理解还是很有价值的。hhh

时间: 2024-10-05 05:32:10

3366 【模板】最小生成树(Prim)的相关文章

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 =

poj2031Building a Space Station(最小生成树prim)

题目链接: 啊哈哈,点我点我 题意: 就是空间站之间有很多球形的东西,然后这些球可能相交,如果相加那么距离为0,否则距离为两球表面的距离,最后求联通这些球形实验室所需要的最小距离... 思路: 相信大家都学过圆相交吧,类推到球是一样的,当两球的距离大于两球的半径之和的时候,说明两球不想交,反之则两球相交,转换成公式为d-(r1+r2)>0则说明两球不相交... 建图后基本上就是套模板了... 题目: Building a Space Station Time Limit: 1000MS   Me

POJ 1258 Agri-Net (最小生成树+Prim)

Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39820   Accepted: 16192 Description Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area. He nee

HDU1162 Eddy&#39;s picture 【最小生成树Prim】

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

poj1861 最小生成树 prim &amp;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 =

HDU1301 Jungle Roads 【最小生成树Prim】

Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4268    Accepted Submission(s): 3120 Problem Description The Head Elder of the tropical island of Lagrishan has a problem. A burst o

HDU1863 畅通工程 【最小生成树Prim】

畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 16722    Accepted Submission(s): 6987 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出

poj2485最小生成树prim

Highways Time Limit: 1000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public highways.

nyist oj 38 布线问题 (最小生成树 prim)

布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1.把所有的楼都供上电. 2.所用电线花费最少 输入 第一行是一个整数n表示有n组测试数据.(n<5) 每组测试数据的第一行是两个整数v,e. v表示学校里楼的总个数(v<=500) 随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c<=100).(哪两栋楼间如果没有指明花费

最小生成树--prim算法

一个无向图G的最小生成树就是由该图的那些连接G的所有顶点的边构成的树,且其总价值最低,因此,最小生成树存在的充分必要条件为图G是连通的,简单点说如下: 1.树的定义:有n个顶点和n-1条边,没有回路的称为树 生成树的定义:生成树就是包含全部顶点,n-1(n为顶点数)条边都在图里就是生成树 最小:指的是这些边加起来的权重之和最小 2.判定条件:向生成树中任加一条边都一定构成回路 充分必要条件:最小生成树存在那么图一定是连通的,反过来,图是连通的则最小生成树一定存在 上图的红色的边加上顶点就是原图的