CCF 数据中心 100分

女爷i 2023-07-14 10:57 90阅读 0赞























试题编号: 201812-4
试题名称: 数据中心
时间限制: 1.0s
内存限制: 512.0MB
问题描述:


样例输入

4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2

样例输出

4

样例说明

  下图是样例说明。



思想:kruskal算法求最小生成树,这道题目中的root我觉得没用,其中的father数组对应的是并查集的知识。

  1. #include<bits/stdc++.h>
  2. #include<vector>
  3. using namespace std;
  4. const int MAXN = 500005;
  5. /*
  6. ** 边
  7. */
  8. struct Edge{
  9. int u;
  10. int v;
  11. int len;
  12. Edge(int u,int v,int len){
  13. this->u = u;
  14. this->v = v;
  15. this->len = len;
  16. }
  17. };
  18. int father[MAXN]; //father[u] = v;表示u的祖先为v,如果father[u]=u,表示u是当前连通块的根(最老的祖先)。
  19. vector<Edge> edges; //边集
  20. void initFather(int n){
  21. //初始化father数组
  22. for(int i=1;i<=n;i++){
  23. father[i] = i;
  24. }
  25. }
  26. /*
  27. * 找到x的最老的祖先(当前连通块的根)
  28. */
  29. int findFather(int x){
  30. int z = x;
  31. while(x != father[x]){
  32. x = father[x];
  33. }
  34. int temp;
  35. /*
  36. ** 把x通向它最老祖先(U)路径上的所有节点的最老祖先都设置成U。
  37. ** 而且经过上面的while循环,此时x的值就是U的下标。x就代表了最老祖先。
  38. */
  39. while(z != father[z]){
  40. temp = z;
  41. z = father[z];
  42. father[temp] = x; //把路径上节点的最老祖先设置成U(x)。
  43. }
  44. return x;
  45. }
  46. /*
  47. ** 查看x和y的最老祖先是不是同一个人,如果是同一个人
  48. ** 那么x和y在同一个连通块中,此时x---y这条边不能加入
  49. ** 否则就会产生环。
  50. */
  51. bool unionFather(int x,int y){
  52. int fx = findFather(x);
  53. int fy = findFather(y);
  54. if(fx != fy){//x和y的祖先不是同一个人
  55. /*
  56. **把fy的祖先设置成fx,那么x对应的连通块和y对应的连通块
  57. **就连在了一起,形成了一个新的更大的连通块
  58. */
  59. father[fy] = fx;
  60. return true;
  61. }
  62. return false;
  63. }
  64. /*
  65. ** 根据传输时间给边排序。
  66. */
  67. bool cmp(const Edge &e1,const Edge &e2){
  68. return e1.len < e2.len;
  69. }
  70. int kruskal(int n){
  71. int ans;
  72. int count;
  73. initFather(n);
  74. sort(edges.begin(),edges.end(),cmp);
  75. for(int i=0;i<edges.size();i++){
  76. Edge edge = edges[i];
  77. int u = edge.u;
  78. int v = edge.v;
  79. if(unionFather(u,v)){ //如果不在同一个连通块
  80. ans = edge.len;
  81. count++;
  82. if(count == n-1){ //如果已经加进来了n-1条边说明最小生成树已经形成了。
  83. break;
  84. }
  85. }
  86. }
  87. return ans;
  88. }
  89. int main(){
  90. int n,m,root;
  91. int u,v,len;
  92. cin>>n;
  93. cin>>m;
  94. cin>>root;
  95. while(m--){
  96. cin>>u>>v>>len;
  97. edges.push_back(Edge(u,v,len));
  98. }
  99. cout<<kruskal(n)<<endl;
  100. return 0;
  101. }

发表评论

表情:
评论列表 (有 0 条评论,90人围观)

还没有评论,来说两句吧...

相关阅读

    相关 CCF 模板生成系统 100

    问题描述   成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的。例如,对于展示用户信息的页面,当用户为 Tom 时,网页的