标签:连通 排序 prim int Kruskal 板子 include
Kruskal和prim不同的点在于prim每次都是找离集合距离最小的点,Kruskal找的是图中最短的边,如果边的两端不连通,则加入生成树中,属于是贪心的策略。
思路:
①每次都找最短的边,因此首先对所有的边进行从小到大的排序,因为排序,所以Kruskal的时间复杂度下限就已经是O(nlogn)了;
②判断两个点连不连通,直接使用并查集就可以了。
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 const int N = 2e5 + 9; 6 int n,m,p[N],res,cnt; 7 struct Edge 8 { 9 int a,b,w; 10 bool operator <(const Edge& W) 11 { 12 return w < W.w; 13 } 14 }edges[N]; 15 16 int find(int x) 17 { 18 if(p[x] != x) 19 p[x] = find(p[x]); 20 return p[x]; 21 } 22 23 int main() 24 { 25 cin >> n >> m; 26 for(int i = 0;i < m;++i) 27 { 28 int a,b,c; 29 cin >> a >> b >> c; 30 edges[i] = {a,b,c}; 31 } 32 33 for(int i = 1;i <= n;++i) 34 p[i] = i; 35 36 sort(edges,edges + m); 37 38 for(int i = 0;i < m;++i) 39 { 40 int a = edges[i].a,b = edges[i].b,w = edges[i].w; 41 int pa = find(a),pb = find(b); 42 if(pa != pb) 43 { 44 ++cnt; 45 res += w; 46 p[pa] = pb; 47 } 48 } 49 if(cnt < n - 1) 50 cout << "impossible" << endl; 51 else 52 cout << res << endl; 53 return 0; 54 }
标签:连通,排序,prim,int,Kruskal,板子,include 来源: https://www.cnblogs.com/fengshi99/p/15437589.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。