链接:https://ac.nowcoder.com/acm/contest/330/G
来源:牛客网

Applese 的毒气炸弹
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

众所周知,Applese 是个很强的选手,它的化学一定很好。

今天他又AK了一套题觉得很无聊,于是想做个毒气炸弹玩。

毒气炸弹需要 k 种不同类型元素构成,Applese一共有 n 瓶含有这些元素的试剂。

已知元素混合遵循 m 条规律,每一条规律都可以用 "x y c" 描述。

表示将第 x 瓶试剂混入第 y 瓶试剂或者把第 y 瓶试剂混入第 x 瓶试剂,需要消耗 c 的脑力。

特别地,除了这 m 条规律外,Applese 可以将任意两瓶相同元素的试剂混合,且不需要消耗脑力。

Applese 想要配出毒气炸弹,就需要使 S 中含有 1∼k1∼k 这 k 种元素。它想知道自己最少花费多少脑力可以把毒气炸弹做出来。

输入描述:

  1. 第一行为三个整数 n, m, k 表示 Applese 拥有的试剂的数量,混合规律的数量和所需的元素种类数。
    第二行为 n 个整数 a1,a2,…,ana1,a2,…,an,分别表示每一瓶试剂的元素类型。
    接下来m行,每行三个整数 x, y, c,含义如题目描述中所述。不保证 x, y的试剂种类不同。

输出描述:

  1. 输出一个正整数表示最小的耗费脑力。特别地,如果无法合成出毒气炸弹,输出 "-1"
示例1

输入

复制

  1. 6 8 2
  2. 1 1 1 2 2 2
  3. 1 2 1
  4. 2 3 2
  5. 1 3 3
  6. 3 4 6
  7. 4 5 1
  8. 4 6 3
  9. 5 6 2
  10. 1 6 2

输出

复制

  1. 2

备注:

  1. 1n,k,m1051n,k,m105
    1x,yn,xy1x,yn,xy
    1c109
  2.  
  3. 思路:
    看成一张图,就是把同类元素的试剂当作一个点之后,求这个图的最小生成树。
    然后用你最喜欢的求MST的算法求解就好。注意判不连通的情况。
  4.  
  5. 细节见代码
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <queue>
  7. #include <stack>
  8. #include <map>
  9. #include <set>
  10. #include <vector>
  11. #define rt return
  12. #define sz(a) int(a.size())
  13. #define all(a) a.begin(), a.end()
  14. #define rep(i,x,n) for(int i=x;i<n;i++)
  15. #define repd(i,x,n) for(int i=x;i<=n;i++)
  16. #define pii pair<int,int>
  17. #define pll pair<long long ,long long>
  18. #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
  19. #define MS0(X) memset((X), 0, sizeof((X)))
  20. #define MSC0(X) memset((X), '\0', sizeof((X)))
  21. #define pb push_back
  22. #define mp make_pair
  23. #define fi first
  24. #define se second
  25. #define eps 1e-6
  26. #define gg(x) getInt(&x)
  27. #define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
  28. using namespace std;
  29. typedef long long ll;
  30. ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
  31. ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
  32. ll powmod(ll a,ll b,ll MOD){ll ans=;while(b){if(b%)ans=ans*a%MOD;a=a*a%MOD;b/=;}return ans;}
  33. inline void getInt(int* p);
  34. const int maxn=;
  35. const int inf=0x3f3f3f3f;
  36. /*** TEMPLATE CODE * * STARTS HERE ***/
  37. struct Edge
  38. {
  39. int f,t,w;
  40. Edge(){}
  41. Edge(int ff,int tt,int ww)
  42. {
  43. f=ff;
  44. t=tt;
  45. w=ww;
  46. }
  47. };
  48. std::vector<Edge> edge;
  49. bool cmp(Edge a,Edge b)
  50. {
  51. return a.w<b.w;
  52. }
  53. // 并查集部分
  54. int fa[maxn];
  55. int findpar(int x)
  56. {
  57. if(fa[x]==x)
  58. return x;
  59. else
  60. return fa[x]=findpar(fa[x]);
  61. }
  62. void initufs(int n)
  63. {
  64. repd(i,,n)
  65. {
  66. fa[i]=i;
  67. }
  68. }
  69. int n,m,k; //
  70. int a[maxn];
  71. ll Kruskal()
  72. {
  73. ll res=0ll;
  74. initufs(n);
  75. int cnt=;// 记录了MST加入了几个节点
  76. for(int i=;i<edge.size();i++)
  77. {
  78. int u=findpar(edge[i].f);
  79. int v=findpar(edge[i].t);
  80. if(u==v)
  81. continue;
  82. fa[u]=v; // merge
  83. res+=edge[i].w;
  84. cnt++;
  85. if(cnt==k-) // 已经加满了树
  86. break;
  87. }
  88. if(cnt!=k-)
  89. return -;
  90. else
  91. return res;
  92. }
  93. int main()
  94. {
  95. scanf("%d %d %d",&n,&m,&k);
  96. repd(i,,n)
  97. {
  98. scanf("%d",&a[i]);
  99. }
  100. int u,v,w;
  101. repd(i,,m)
  102. {
  103. scanf("%d %d %d",&u,&v,&w);
  104. u=a[u];v=a[v];
  105. if(u==v)
  106. continue;
  107. if(u>=&&u<=k&&v>=&&v<=k)
  108. {
  109. edge.push_back(Edge(u,v,w));
  110. }
  111.  
  112. }
  113. sort(edge.begin(),edge.end(),cmp);
  114. ll res=Kruskal();
  115. printf("%lld\n",res );
  116. return ;
  117. }
  118.  
  119. inline void getInt(int* p) {
  120. char ch;
  121. do {
  122. ch = getchar();
  123. } while (ch == ' ' || ch == '\n');
  124. if (ch == '-') {
  125. *p = -(getchar() - '');
  126. while ((ch = getchar()) >= '' && ch <= '') {
  127. *p = *p * - ch + '';
  128. }
  129. }
  130. else {
  131. *p = ch - '';
  132. while ((ch = getchar()) >= '' && ch <= '') {
  133. *p = *p * + ch - '';
  134. }
  135. }
  136. }
  1.  

Applese 的毒气炸弹 G 牛客寒假算法基础集训营4(图论+最小生成树)的更多相关文章

  1. 2020牛客寒假算法基础集训营2 J题可以回顾回顾

    2020牛客寒假算法基础集训营2 A.做游戏 这是个签到题. #include <cstdio> #include <cstdlib> #include <cstring ...

  2. 2020牛客寒假算法基础集训营1 J题可以回顾回顾

    2020牛客寒假算法基础集训营1 这套题整体来说还是很简单的. A.honoka和格点三角形 这个题目不是很难,不过要考虑周全,面积是1,那么底边的长度可以是1也可以是2, 注意底边1和2会有重复的, ...

  3. 牛客寒假算法基础集训营4 G Applese 的毒气炸弹

    链接:https://ac.nowcoder.com/acm/contest/330/G来源:牛客网 众所周知,Applese 是个很强的选手,它的化学一定很好. 今天他又AK了一套题觉得很无聊,于是 ...

  4. 牛客寒假算法基础集训营4 I题 Applese 的回文串

    链接:https://ac.nowcoder.com/acm/contest/330/I 来源:牛客网 自从 Applese 学会了字符串之后,精通各种字符串算法,比如--判断一个字符串是不是回文串. ...

  5. 牛客寒假算法基础集训营4 C Applese 走迷宫

    链接:https://ac.nowcoder.com/acm/contest/330/C来源:牛客网 精通程序设计的 Applese 双写了一个游戏. 在这个游戏中,它被困在了一个 n×m迷宫 在迷宫 ...

  6. 牛客寒假算法基础集训营4 I Applese 的回文串

    链接:https://ac.nowcoder.com/acm/contest/330/I来源:牛客网 自从 Applese 学会了字符串之后,精通各种字符串算法,比如……判断一个字符串是不是回文串. ...

  7. 牛客寒假算法基础集训营4 F Applese 的大奖

    链接:https://ac.nowcoder.com/acm/contest/330/H来源:牛客网 Applese 和它的小伙伴参加了一个促销的抽奖活动,活动的规则如下:有一个随机数生成器,能等概率 ...

  8. 牛客寒假算法基础集训营4 F Applese 的QQ群

    链接:https://ac.nowcoder.com/acm/contest/330/F来源:牛客网 Applese 有一个QQ群.在这个群中,大家互相请教问题.如 b 向 a 请教过问题,就把 a ...

  9. 牛客寒假算法基础集训营2 【处女座与复读机】DP最小编辑距离【模板题】

    链接:https://ac.nowcoder.com/acm/contest/327/G来源:牛客网 一天,处女座在牛客算法群里发了一句“我好强啊”,引起无数的复读,可是处女座发现复读之后变成了“处女 ...

随机推荐

  1. EF CodeFirst使用Nuget更新数据库

    常用命令: 1.开启迁移 Enable-Migrations -EnableAutomaticMigrations 2.添加一条迁移记录 Add-Migration AddMigration001 3 ...

  2. c/c++ 标准库 string

    c/c++ 标准库 string 标准库 string的小例子 test1~test10 #include <iostream> using namespace std; int main ...

  3. pom文件

    groupid和artifactId被统称为“坐标”是为了保证项目唯一性而提出的,如果你要把你项目弄到maven本地仓库去,你想要找到你的项目就必须根据这两个id去查找. groupId一般分为多个段 ...

  4. innerHTML的使用

        inerHTML是html标签的属性,成对出现的标签大多数都有这个属性,用来设置或获取位于对象起始和结束标签 内的HTML.(获取HTML当前标签的起始和结束里面的内容)不包括标签本身.   ...

  5. 数据结构【查找】—平衡二叉树AVL

    /*自己看了半天也没看懂代码,下次再补充说明*/ 解释: 平衡二叉树(Self-Balancing Binary Search Tree 或Height-Balanced Binary Search ...

  6. IIS 发布ASP.NET MVC 4.0 错误500.21解决办法

    由VS2013 写好的MVC 4.0 发布在服务器IIS 上报错500.21,解决办法:尝试多种网上介绍的办法,最后发现还是模块问题.

  7. 一文读懂SpringCloud与Eureka,Feign,Ribbon,Hystrix,Zuul核心组件间的关系

    概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓 ...

  8. ES5-ES6-ES7_字符串与JOSN格式的数据相互转换以及深度克隆新对象

    这篇文章主要来讲HTML5中的新方法:parse()把字符串转换成josn格式的数据和stringify()把josn格式的数据转换成字符串 eval()方法的回顾 eval()方法可以将任何字符串解 ...

  9. PHP设计模式_工厂模式

    个人理解工厂类相当于平时用的基类,只需要把类new一次然后付给一个变量,以后直接引入基类调用变量使用类里的方法即可 了解 工厂模式,工厂方法或者类生成对象,而不是在代码中直接new. 使用工厂模式,可 ...

  10. pm2命令,端口查询,mongodb服务启动,nginx服务启动,n模块的使用,搭建nodejs服务器环境,搭建oracledb服务器环境 linux的环境搭建

    pm2命令 pm2 ls //查询pm2 启动的列表 pm2 start app.js //启动文件 pm2 restart app //重启项目 pm2 logs app //监控项目执行日志打印 ...