三原色图

 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
5 8
1 5 1 R
2 1 2 R
5 4 5 R
4 5 3 G
1 3 3 G
4 3 5 G
5 4 1 B
1 2 2 B
Sample Output
Case #1:
-1
-1
-1
9
10
12
17
22 解析 直接建图 判断连不连通 跑最小生成树 特判1个点的情况。 AC代码
 #include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define fillchar(a, x) memset(a, x, sizeof(a))
#define huan printf("\n");
#define debug(a,b) cout<<a<<" "<<b<<" "<<endl;
using namespace std;
typedef long long ll;
const int maxn=+,inf=0x3f3f3f3f;
const ll mod=1e9+;
int n,m;
int p[maxn],par[maxn],g[maxn][maxn];
struct edge
{
int u,v,w,id;
char col;
} a[maxn],b[maxn],c[maxn];
int cmp(edge a,edge b)
{
return a.w<b.w;
}
int find_(int x)
{
return p[x]==x?x:p[x]=find_(p[x]);
}
int _find(int x)
{
return x==par[x]?x:par[x]=_find(par[x]);
}
void unio(int a,int b)
{
int ra=_find(a);
int rb=_find(b);
if(ra!=rb)
par[rb]=ra;
}
int ans1[maxn],ans2[maxn];
int main()
{
int t,kase=;
cin>>t;
while(t--)
{
map<int,int> mp;
scanf("%d %d",&n,&m);
int u,v,w;
for(int i=; i<m; i++)
{
cin>>a[i].u>>a[i].v>>a[i].w>>a[i].col;
a[i].id=i;
}
printf("Case #%d:\n",kase++);
sort(a,a+m,cmp);
//for(int i=0;i<m;i++)
// debug(a[i].w,a[i].col);
if(n==)
{
int sum=;
for(int i=; i<m; i++)
{
sum+=a[i].w;
cout<<sum<<endl;
}
continue;
}
//------------------------------------------------------------------------------
int cnt=,flag1=;mp.clear();
memset(g,inf,sizeof(g));
memset(ans1,inf,sizeof(ans1));
for(int i=; i<=n; i++)
p[i]=i,par[i]=i;
for(int i=; i<m; i++)
{
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)
{
g[a[i].u][a[i].v]=g[a[i].v][a[i].u]=a[i].w;
b[cnt++]= {a[i].u,a[i].v,a[i].w,a[i].id,a[i].col};
unio(a[i].u,a[i].v);
}
}
for(int i=; i<=n; i++)
if(_find(i-)!=_find(i))flag1=;
if(flag1)
{
sort(b,b+cnt,cmp);
ans1[n-]=;
for(int i=; i<cnt; i++)
{
int x,y,z;
x=find_(b[i].u),y=find_(b[i].v),z=b[i].w;
if(x!=y)
{
ans1[n-]+=z;
mp[b[i].id]=;
p[x]=y;
}
}
int k=n;
for(int i=; i<m; i++)
{
if(mp[a[i].id]==)
ans1[k]=ans1[k-]+a[i].w,k++;
}
}
//---------------------------------------------------------------------------------------------
int flag2=;cnt=;mp.clear();
memset(g,inf,sizeof(g));
memset(ans2,inf,sizeof(ans2));
for(int i=; i<=n; i++)
p[i]=i,par[i]=i;
for(int i=; i<m; i++)
{
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)
{
g[a[i].u][a[i].v]=g[a[i].v][a[i].u]=a[i].w;
b[cnt++]={a[i].u,a[i].v,a[i].w,a[i].id,a[i].col};
unio(a[i].u,a[i].v);
}
}
for(int i=; i<=n; i++)
if(_find(i-)!=_find(i))flag2=;
if(flag2==&&flag1==)
{
for(int i=;i<=m; i++)
cout<<-<<endl;
continue;
}
if(flag2)
{ sort(b,b+cnt,cmp);
ans2[n-]=;
for(int i=; i<cnt; i++)
{
int x,y,z;
x=find_(b[i].u),y=find_(b[i].v),z=b[i].w;
if(x!=y)
{
ans2[n-]+=z;
mp[b[i].id]=;
p[x]=y;
}
}
int k=n;
for(int i=; i<m; i++)
{
if(mp[a[i].id]==)
ans2[k]=ans2[k-]+a[i].w,k++;
}
}
for(int i=; i<n-; i++)
cout<<-<<endl;
for(int i=n-; i<=m; i++)
{
cout<<min(ans1[i],ans2[i])<<endl;
}
}
}

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. JavaScript 字符串与数字的相互转换

    js字符串转换成数字 js 字符串转换数字方法主要有三种:转换函数.强制类型转换.利用JS变量弱类型特点进行转换 1. 转换函数:js提供了parseInt()和parseFloat()两个转换函数. ...

  2. mac homebrew安装

    http://book.51cto.com/art/201107/278761.htm 3.2.3 使用 Homebrew 安装 Git Mac OS X 有好几个包管理器,用于管理一些开源软件在 M ...

  3. 如何使用capedit分割数据包文件

    wireshark是一个网络数据包的分析工具,主要用来捕获网卡上的数据包并显示数据包的详细内容.在处理一些大的数据包文件时,如果直接用wireshark图形工具打开一些大文件的数据包会出现响应慢甚至没 ...

  4. 如何破解密码的哈希值,破解双MD5密码值

    这是关于我如何破解密码的哈希值1亿2200万* John the Ripper和oclHashcat-plus故事. 这是几个月前,当我看到一条推特:从korelogic约含共1亿4600万个密码的密 ...

  5. raid 0 1 5 10 总结的知识点

    raid 0 1 5 10 raid 发的别名条带 raid 0 读取性能最高需要磁盘2*N个(N>0)代表所有raid级别中的最高存储性能,其实原理就是把连续的数据分散到多个磁盘上存取,这样, ...

  6. Unity3D 在自定义脚本中实现Button组件上的OnClick面板

    下述内容不对c#语法做过多讲解,仅对已入门并有兴趣的同学做为学习和拓展的资料 大家在Unity制作的过程中一定都使用过UI功能,那么很多人也一定见过这个面板: 那么我们如何能在自己的脚本中添加上像On ...

  7. 记忆化搜索 || POJ 1088 滑雪

    从任意一点可以往上下左右比它小的数那里走,问最远长度是多少 *解法:每一点dfs搜索一遍 记忆化搜索:http://blog.csdn.net/acmer_sly/article/details/53 ...

  8. 【转】关于编写WPF UserControl时提示The name 'InitializeComponent' does not exist in the current contextr的解决!

    1.打开.csproj(工程)文件. 2.找到<Import Project="$(MSBuildBinPath)/Microsoft.CSharp.targets" /&g ...

  9. 理解 Word2Vec 之 Skip-Gram 模型

    理解 Word2Vec 之 Skip-Gram 模型 天雨粟 模型师傅 / 果粉 https://zhuanlan.zhihu.com/p/27234078 508 人赞同了该文章 注明:我发现知乎有 ...

  10. PyTorch的十七个损失函数

    本文截取自<PyTorch 模型训练实用教程>,获取全文pdf请点击: tensor-yu/PyTorch_Tutorial​github.com 版权声明:本文为博主原创文章,转载请附上 ...