[kuangbin带你飞]专题六 最小生成树 E - QS Network

末蓝、 2023-08-17 15:41 223阅读 0赞

E - QS Network

题目链接:

https://vjudge.net/contest/66965#problem/E

题目:

在星系cgb的w-503行星中,有一种名为QS的智能生物。 QS通过网络相互通信。如果两个QS想要连接,他们需要购买两个网络适配器(每个QS一个)和一段网络电缆。请注意,一个网络适配器只能在单个连接中使用。(即,如果QS想要设置四个连接,则需要购买四个适配器)。在通信过程中,QS将其消息广播到它所连接的所有QS,接收消息的QS组将消息广播到它们所连接的所有QS,重复该过程直到所有QS都收到消息。

  1. 示例如下所示:
  2. QS网络示例,QS A想要发送消息。
  3. 步骤1. QS AQS BQS C发送消息;
  4. 步骤2. QS BQS A发送消息; QS CQS AQS D发送消息;
  5. 步骤3.该过程终止,因为所有QS都收到了该消息。
  6. 每个QS都有其优质的网络适配器品牌,并始终在其所有连接中购买该品牌。 QS之间的距离也不同。考虑到每个QS优先品牌的网络适配器的价格以及每对QS之间的电缆价格,您的任务是编写一个程序来确定设置QS网络的最低​​成本。

输入

  1. 输入的第一行包含一个整数t,表示数据集的数量。
  2. 从第二行开始,有t个数据集。
  3. 在单个数据集中,第1行包含一个表示QS数的整数n
  4. 第二行包含n个整数,表示每个QS最喜欢的网络适配器的价格。
  5. 在第3行到第n + 2行包含一个矩阵,表示ecahQS之间的电缆价格。
  6. 限制:
  7. 输入中的所有整数都是非负数且不超过1000

产量

  1. 对于每个数据集,输出一行中的最小成本。不需要额外的空行。

样本输入

  1. 1
  2. 3
  3. 10 20 30
  4. 0 100 200
  5. 100 0 300
  6. 200 300 0

样本输出

  1. 370

思路:这道题要处理的东西比模板多一点,就是每个QS都有自己喜欢的适配器价格,然而两人之间需要有电缆,电缆也因人而异,

所以以往的node[i].w+=x改成node[i].w+=x+a[i]+a[j],就是两者之间的适配器加上i->j和j->i之间的电缆价格就行了,主意数组要开大

我用的2e5+10wa掉了,用的2e6+10就ac了

  1. //
  2. // Created by hy on 2019/7/30.
  3. //
  4. #include <algorithm>
  5. #include <iostream>
  6. #include <cstdio>
  7. #include <cstring>
  8. #include <queue>
  9. #include <set>
  10. using namespace std;
  11. typedef long long ll;
  12. const int maxn=2e6+10;
  13. int father[maxn],a[maxn];
  14. struct Node{
  15. int u,v,w;
  16. bool operator<(const Node &other)const{
  17. return this->w<other.w;
  18. }
  19. }node[maxn];
  20. int find(int x)
  21. {
  22. if(x==father[x])
  23. return x;
  24. return father[x]=find(father[x]);
  25. }
  26. int main()
  27. {
  28. int T;
  29. int n;
  30. scanf("%d",&T);
  31. while(T--)
  32. {
  33. scanf("%d",&n);
  34. for(int i=0;i<=n;i++)
  35. father[i]=i;
  36. for(int i=1;i<=n;i++)
  37. {
  38. scanf("%d",&a[i]);
  39. }
  40. int p;
  41. int m=0;
  42. for(int i=1;i<=n;i++)
  43. {
  44. for(int j=1;j<=n;j++)
  45. {
  46. scanf("%d",&p);
  47. node[m].u=i;
  48. node[m].v=j;
  49. node[m++].w=p+a[i]+a[j];
  50. }
  51. }
  52. int sum=0;
  53. int cnt=0;
  54. sort(node,node+m);
  55. for(int i=0;i<m;i++)
  56. {
  57. int uu=find(node[i].u);
  58. int vv=find(node[i].v);
  59. if(uu==vv)
  60. continue;
  61. else
  62. {
  63. sum+=node[i].w;
  64. father[uu]=vv;
  65. cnt++;
  66. if(cnt==n-1)
  67. break;
  68. }
  69. }
  70. printf("%d\n",sum);
  71. }
  72. return 0;
  73. }

转载于:https://www.cnblogs.com/Vampire6/p/11273568.html

发表评论

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

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

相关阅读