牛客:喜迎暑假多校联赛第一场H题:呜米喵想要成为爱抖露!
链接:https://ac.nowcoder.com/acm/problem/222737
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
这一天MeUmy的大草原上突然出现了一个anti,他用了一个奇怪的装置把呜米的直播账号给锁住了。并留下说明书后光速跑路!
解锁账号有两种方法!
一、
这个装置上有一个地图,上面有n座城市。还有一张数据表,表内有m条数据,表示了每个城市之前存在的交通路线,格式为三个整数A B C 代表A城市到B城市需要花费C元。 (路是双向的 出题人没见过单向的路....)
呜米需要用这些连接方式把所有城市连在一起,连接城市需要用到的交通路线的总花费小于K元,才能解锁自己的账号。
二、
只要呜米去翻垃圾桶,然后喝长毛的的奶茶。账号就会自动解锁!!!
因为呜米不想用第二方法,所以她把城市进行了编号1-n,然后把交通路线的数据发到了群里。求救!
这时一位gachi看不下去了,他对这个装置进行了改造,但是他比那个anti弱所以没办法直接解开,不过在他的不懈努力之下这个装置终于被他搞出了BUG。
本来这个装置在呜米连接好所有城市后会计算总花费。但因为那个bug导致这个装置,会把费用是质数的边当做费用为0。
比如A B C,代表A城市到B城市需要花费C元,C如果是质数,在用的时候费用算作0。
所以第一个方法完成的难度降低了。
输入描述:
第一行三个整数 n m k
1≤n≤m≤2∗1051\leq n \leq m \leq 2*10^{5}1≤n≤m≤2∗105 1≤k≤1091\leq k \leq 10^{9}1≤k≤109
以下m行每行三个整数 A B C
1≤A≤B≤n1\leq A\leq B\leq n1≤A≤B≤n 1≤C≤1071\leq C \leq 10^{7}1≤C≤107
输出描述:
如果第一种方法可以解锁账号 请输出:wmmxycwdjdwdlnljbzwtskirakira
本来应该输出这个但是qcjj说中文会炸(呜米喵想要成为大家的爱抖露 努力进步在舞台上kirakira)
如果需要第二种方法解锁账号 请输出:wmmxycwdjdwdlnljbzwtsfljt
本来应该输出这个但是qcjj说中文会炸(呜米喵想要成为大家的爱抖露 努力进步在舞台上翻垃圾桶)
输入
5 2 8 2 2 38 4 5 16
输出
wmmxycwdjdwdlnljbzwtsfljt
一道求最小生成树的题,只需对边进行排序,然后加边(这里要判断加的边是否连接两个独立的块),这里我用并查集进行判断,详情看代码
#include<bits/stdc++.h>
using namespace std;
bool p[10000005];
struct xxx {
int x,y,num;
} s[200005];
int f[200005];
bool cmp(xxx a,xxx b) {
return a.num<b.num;
}
int find(int x) {
return f[x]==x?x:f[x]=find(f[x]);//压缩路径f[x]=find(f[x])
}
void unit(int x,int y) {
int x1=find(f[x]),y1=find(f[y]);
f[x1]=y1;//合并根节点
}
int main() {
long long n,m,k,b=0,ans=0;
//素数
for(int i=1; i<=10000001; i++)
p[i]=true;
for(int i=2; i<=10000001; i++) {
for(int j=i+i; j<=10000001; j+=i) {
p[j]=false;
}
}
cin >> n >> m >> k;
for(int i=1; i<=n; i++)
f[i]=i;
for(int i=0; i<m; i++) {
scanf("%d %d %d",&s[i].x,&s[i].y,&s[i].num);
if(p[s[i].num])
s[i].num=0;
}
sort(s,s+m,cmp);
for(int i=0;i<m;i++){
if(b==n-1)
break;
int x=find(s[i].x),y=find(s[i].y);
if(x!=y) {
b++;
ans+=s[i].num;
unit(x,y);
}
}
// for(int i=0;i<m;i++)
// cout << s[i].x << " "<< s[i].y << " " << s[i].num << endl;
// cout << b << endl << ans << endl;
if(b==n-1&&ans<k)
cout << "wmmxycwdjdwdlnljbzwtskirakira" << endl;
else
cout << "wmmxycwdjdwdlnljbzwtsfljt" << endl;
return 0;
}