三原色图

 Accepts: 281
 Submissions: 1261
 Time Limit: 1500/1000 MS (Java/Others)
 Memory Limit: 262144/262144 K (Java/Others)
Problem Description

度度熊有一张 nn 个点 mm 条边的无向图,所有点按照 1,2,\cdots,n1,2,⋯,n 标号,每条边有一个正整数权值以及一种色光三原色红、绿、蓝之一的颜色。

现在度度熊想选出恰好 kk 条边,满足只用这 kk 条边之中的红色边和绿色边就能使 nn 个点之间两两连通,或者只用这 kk 条边之中的蓝色边和绿色边就能使 nn 个点之间两两连通,这里两个点连通是指从一个点出发沿着边可以走到另一个点。

对于每个 k=1,2,\cdots,mk=1,2,⋯,m,你都需要帮度度熊计算选出恰好 kk 条满足条件的边的权值之和的最小值。

Input

第一行包含一个正整数 TT,表示有 TT 组测试数据。

接下来依次描述 TT 组测试数据。对于每组测试数据:

第一行包含两个整数 nn 和 mm,表示图的点数和边数。

接下来 mm 行,每行包含三个整数 a,b,wa,b,w 和一个字符 cc,表示有一条连接点 aa 与点 bb 的权值为 ww、颜色为 cc 的无向边。

保证 1 \leq T \leq 1001≤T≤100,1 \leq n,m \leq 1001≤n,m≤100,1 \leq a,b \leq n1≤a,b≤n,1 \leq w \leq 10001≤w≤1000,c \in {R,G,B}c∈{R,G,B},这里 R,G,BR,G,B 分别表示红色、绿色和蓝色。

Output

对于每组测试数据,先输出一行信息 "Case #x:"(不含引号),其中 x 表示这是第 xx 组测试数据,接下来 mm 行,每行包含一个整数,第 ii 行的整数表示选出恰好 ii 条满足条件的边的权值之和的最小值,如果不存在合法方案,输出 -1−1,行末不要有多余空格。

Sample Input
  1. 1
  2. 5 8
  3. 1 5 1 R
  4. 2 1 2 R
  5. 5 4 5 R
  6. 4 5 3 G
  7. 1 3 3 G
  8. 4 3 5 G
  9. 5 4 1 B
  10. 1 2 2 B
Sample Output
  1. Case #1:
  2. -1
  3. -1
  4. -1
  5. 9
  6. 10
  7. 12
  8. 17
  9. 22
  10.  
  11. 解析 直接建图 判断连不连通 跑最小生成树 特判1个点的情况。
  12.  
  13. AC代码
  1. #include <bits/stdc++.h>
  2. #define pb push_back
  3. #define mp make_pair
  4. #define fi first
  5. #define se second
  6. #define all(a) (a).begin(), (a).end()
  7. #define fillchar(a, x) memset(a, x, sizeof(a))
  8. #define huan printf("\n");
  9. #define debug(a,b) cout<<a<<" "<<b<<" "<<endl;
  10. using namespace std;
  11. typedef long long ll;
  12. const int maxn=+,inf=0x3f3f3f3f;
  13. const ll mod=1e9+;
  14. int n,m;
  15. int p[maxn],par[maxn],g[maxn][maxn];
  16. struct edge
  17. {
  18. int u,v,w,id;
  19. char col;
  20. } a[maxn],b[maxn],c[maxn];
  21. int cmp(edge a,edge b)
  22. {
  23. return a.w<b.w;
  24. }
  25. int find_(int x)
  26. {
  27. return p[x]==x?x:p[x]=find_(p[x]);
  28. }
  29. int _find(int x)
  30. {
  31. return x==par[x]?x:par[x]=_find(par[x]);
  32. }
  33. void unio(int a,int b)
  34. {
  35. int ra=_find(a);
  36. int rb=_find(b);
  37. if(ra!=rb)
  38. par[rb]=ra;
  39. }
  40. int ans1[maxn],ans2[maxn];
  41. int main()
  42. {
  43. int t,kase=;
  44. cin>>t;
  45. while(t--)
  46. {
  47. map<int,int> mp;
  48. scanf("%d %d",&n,&m);
  49. int u,v,w;
  50. for(int i=; i<m; i++)
  51. {
  52. cin>>a[i].u>>a[i].v>>a[i].w>>a[i].col;
  53. a[i].id=i;
  54. }
  55. printf("Case #%d:\n",kase++);
  56. sort(a,a+m,cmp);
  57. //for(int i=0;i<m;i++)
  58. // debug(a[i].w,a[i].col);
  59. if(n==)
  60. {
  61. int sum=;
  62. for(int i=; i<m; i++)
  63. {
  64. sum+=a[i].w;
  65. cout<<sum<<endl;
  66. }
  67. continue;
  68. }
  69. //------------------------------------------------------------------------------
  70. int cnt=,flag1=;mp.clear();
  71. memset(g,inf,sizeof(g));
  72. memset(ans1,inf,sizeof(ans1));
  73. for(int i=; i<=n; i++)
  74. p[i]=i,par[i]=i;
  75. for(int i=; i<m; i++)
  76. {
  77. if((a[i].col=='R'||a[i].col=='G')&&a[i].w<g[a[i].u][a[i].v]&&a[i].u!=a[i].v)
  78. {
  79. g[a[i].u][a[i].v]=g[a[i].v][a[i].u]=a[i].w;
  80. b[cnt++]= {a[i].u,a[i].v,a[i].w,a[i].id,a[i].col};
  81. unio(a[i].u,a[i].v);
  82. }
  83. }
  84. for(int i=; i<=n; i++)
  85. if(_find(i-)!=_find(i))flag1=;
  86. if(flag1)
  87. {
  88. sort(b,b+cnt,cmp);
  89. ans1[n-]=;
  90. for(int i=; i<cnt; i++)
  91. {
  92. int x,y,z;
  93. x=find_(b[i].u),y=find_(b[i].v),z=b[i].w;
  94. if(x!=y)
  95. {
  96. ans1[n-]+=z;
  97. mp[b[i].id]=;
  98. p[x]=y;
  99. }
  100. }
  101. int k=n;
  102. for(int i=; i<m; i++)
  103. {
  104. if(mp[a[i].id]==)
  105. ans1[k]=ans1[k-]+a[i].w,k++;
  106. }
  107. }
  108. //---------------------------------------------------------------------------------------------
  109. int flag2=;cnt=;mp.clear();
  110. memset(g,inf,sizeof(g));
  111. memset(ans2,inf,sizeof(ans2));
  112. for(int i=; i<=n; i++)
  113. p[i]=i,par[i]=i;
  114. for(int i=; i<m; i++)
  115. {
  116. if((a[i].col=='B'||a[i].col=='G')&&a[i].w<g[a[i].u][a[i].v]&&a[i].u!=a[i].v)
  117. {
  118. g[a[i].u][a[i].v]=g[a[i].v][a[i].u]=a[i].w;
  119. b[cnt++]={a[i].u,a[i].v,a[i].w,a[i].id,a[i].col};
  120. unio(a[i].u,a[i].v);
  121. }
  122. }
  123. for(int i=; i<=n; i++)
  124. if(_find(i-)!=_find(i))flag2=;
  125. if(flag2==&&flag1==)
  126. {
  127. for(int i=;i<=m; i++)
  128. cout<<-<<endl;
  129. continue;
  130. }
  131. if(flag2)
  132. {
  133.  
  134. sort(b,b+cnt,cmp);
  135. ans2[n-]=;
  136. for(int i=; i<cnt; i++)
  137. {
  138. int x,y,z;
  139. x=find_(b[i].u),y=find_(b[i].v),z=b[i].w;
  140. if(x!=y)
  141. {
  142. ans2[n-]+=z;
  143. mp[b[i].id]=;
  144. p[x]=y;
  145. }
  146. }
  147. int k=n;
  148. for(int i=; i<m; i++)
  149. {
  150. if(mp[a[i].id]==)
  151. ans2[k]=ans2[k-]+a[i].w,k++;
  152. }
  153. }
  154. for(int i=; i<n-; i++)
  155. cout<<-<<endl;
  156. for(int i=n-; i<=m; i++)
  157. {
  158. cout<<min(ans1[i],ans2[i])<<endl;
  159. }
  160. }
  161. }

2018 百度之星 初赛 第六题 HDU6349的更多相关文章

  1. 2018百度之星初赛B - A,D,F

    总结:这一次的百度之星之行到这里也就结束了,充分的认识到了自己的不足啊...果然还是做的题太少,,见识的题型也还太少,对于STL的掌握还是不够到位啊!!(STL大法是真的好,建议大家认认真真的好好学学 ...

  2. 2018"百度之星"程序设计大赛 - 资格赛 - 题集

    1001 $ 1 \leq m \leq 10 $ 像是状压的复杂度. 于是我们(用二进制)枚举留下的问题集合 然后把这个集合和问卷们的答案集合 $ & $ 一下 就可以只留下被选中的问题的答 ...

  3. 【2018百度之星初赛(A)】1002 度度熊学队列

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6375 Knowledge Point: STL - map:https://www.cnblogs.c ...

  4. 2018百度之星初赛(A)2 度度熊学队列

    思路: 记录一下c++ stl中的双向链表list的各种用法. https://blog.csdn.net/fanyun_01/article/details/56881515 实现: #includ ...

  5. 【2018百度之星初赛 B】1001并查集 1004二分 1006不等式

    1001 degree 题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6380 并查集向图中加点,分别记录与初始度数最多的点 直接相连的点数.独立的点数 ...

  6. 2018百度之星初赛B轮 p1m2

    p1m2 Accepts: 954 Submissions: 4063 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/1310 ...

  7. 2018百度之星初赛B轮 rect

    rect Accepts: 1654 Submissions: 2948 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131 ...

  8. 2018百度之星初赛A轮 度度熊拼三角

    #include<bits/stdc++.h> using namespace std; int n; int a[1005]; int main() {     int ans;     ...

  9. 2018百度之星初赛A轮 度度熊学队列

    注意:刚开始用数组存deque<int> qa[MAX]会爆内存 需要改用map<int, deque<int> > qa优化 不明觉厉 #include<b ...

随机推荐

  1. MongoDB部署、使用、监控及调优

    MongoDB部署 系统环境:CentOS7   下载地址:http://mirrors.163.com/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD ...

  2. 洛谷 大牛分站 P1000 超级玛丽游戏

    题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用. 建议完成本题目后继续尝试P1001.P1008. 题目描述 超级玛丽是一个非常经典的游戏.请你用字符画的形式输出超级玛丽中的一个场景. *** ...

  3. SQLite与MySQL、SQLServer等异构数据库之间的数据同步

    SQLite DBSync是开源嵌入式数据库SQLite的数据同步引擎,实现了SQLite与SQLite数据库之间以及SQLite与异构数据库(Oracle.MySQL.SQLServer)之间的增量 ...

  4. linux centos 中目录结构的含义

    文件夹的含义  文件夹路径 含义  / 所有内容的开始   /root 系统管理员目录  /bin 缺省的liunx工具,就是存储命令的目录   环境变量等等 /etc 系统的配置    配置文件的存 ...

  5. DB9串口引脚定义

    在单片机串口通信中,使用3根信号线就能够实现通信:RXD,TXD,GND. 经常使用的RS232串口线使用DB9端子. DB9分为公头和母头两种: 一般使用时,引脚定义如下: 连接方式: 注:RXD- ...

  6. Java开发者写SQL时常犯的10个错误

        首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 - 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - iOS ...

  7. 基于HLS(HTTP Live Streaming)的视频直播分析与实现

    转自:http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html HLS(HTTP Live Streaming)的分析: HTT ...

  8. CF666E Forensic Examination SAM+倍增,线段树和并

    题面: 给你一个串S以及一个字符串数组T[1..m],q次询问,每次问S的子串S[p_l..p_r]在T[l..r]中的哪个串里的出现次数最多,并输出出现次数.如有多解输出最靠前的那一个. 分析: 第 ...

  9. PHP中GD库函数

    画椭圆弧 imagearc($image,$cx,$cy,$width,$height,$angel1,$angel2,$color) 注释:$image 图像资源   $cx  椭圆中心点的水平位置 ...

  10. EPT和VPID简介

    EPT(Extended Page Tables,扩展页表),属于Intel的第二代硬件虚拟化技术,它是针对内存管理单元(MMU)的虚拟化扩展.EPT降低了内存虚拟化的难度(与影子页表相比),也提升了 ...