黑白边(并查集)

CANOe实战指南 - 从入门到精通的全流程解析 本文是CANOe实战指南,全面解析从入门到精通的全流程。内容涵盖CANOe软件的核心功能仿真、测试与分析,详细指导安装配置、工程创建、CAN信号收发、UDS诊断通信、CAPL自动化编程以及Panel面板设计。通过实战案例,帮助汽车电子工程师快速掌握这一行业标杆工具,构建自动化测试环境,提升开发与测试效率。 阅读详情

黑白边

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述 

n个点,m条边,每条边分为黑边和白边,现在需要挑一些边出来,使得n个点可以两两联通。由于牛牛特别讨厌白边,所以在挑中的边中,让白边最少,输出白边的条数,如果不能两两联通,输出−1.

输入描述:

 

第一行两个整数n,m. 1≤n,m≤2e5

接下来 m 行, 每行三个整数 x,y,z 代表xy之间有一条边。z的值为0或1,0 代表黑边,1代表白边

输出描述:

/*
*@Author:   GuoJinlong
*@Language: C++
*/
//#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>
using namespace std;
const int mod=1e9+7;
typedef long long  ll;
#define ull unsigned long long
#define scf(n) scanf("%d",&n)
#define scfl(n) scanf("%lld",&n)
#define prf(n) printf("%d",n)
#define prfl(n) printf("%lld",n)
#define scfd(n) scanf("%lf",&n)
#define prfd(n) printf("%.lf",n)
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid (l+r)/2
#define mms(x, y) memset(x, y, sizeof x)
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int MAXN = 305;
const int INF = 0x3f3f3f3f;
const int N=5e4+7;
const int maxn=1e5+5;
const double EPS=1e-10;
const double Pi=3.1415926535897;
inline double max(double a,double b){
    return a>b?a:b;
}
inline double min(double a,double b){
    return a<b?a:b;
}
inline int read() {
    int x=0,f=1; char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    return x*f;
}
int xd[8] = {0, 1, 0, -1, 1, 1, -1, -1};
int yd[8] = {1, 0, -1, 0, -1, 1, -1, 1};
 
//fastPow
int fastPow(int x,int n){
    if(n==1) return x;
    int tmp=fastPow(x,n/2); //fenzi
    if(n%2==1) return tmp*tmp*x;
    else return tmp*tmp;
}
ll gcd(ll m, ll n){return n == 0 ? m : gcd(n, m%n);}
ll lcm(ll m, ll n){return m*n / gcd(m, n);}
ll pows(ll base, ll power,ll mod){ll result=1;while(power>0){if(power&1){result=result*base%mod;}power>>=1;base=(base*base)%mod;}return result;}
 
ll poww(ll base, ll power){ll result=1;while(power>0){if(power&1){result=result*base;}power>>=1;base=(base*base);}return result;}


//dijsktra
//start
//const int MAX= 10020;
//struct node {
//    int x,to,next,w;
//    bool operator <(const node &a) const{
//        return this->w>a.w;
//    }
//}G[MAX<<1];
//int cnt;
//int dis[MAX];
//int vis[MAX];
//int head[MAX];
//
//
//int m,n;
//int b[10020];
//
//
//void add(int u,int v,int w){
//    G[++cnt].to=v;
//    G[cnt].w=w;
//    G[cnt].next=head[u];
//    head[u]=cnt;
//}
//int  dijkstra(int s){
//    mms(dis,INF);
//    dis[s]=0;
//    priority_queue<node> p;
//    node t;
//    t.x=s;
//    t.w=0;
//    p.push(t);
//    while (!p.empty()) {
//        node u=p.top();
//        p.pop();
//        int v=u.x;
//        if(dis[v]!=u.w) continue;
//        for(int i=head[v];i;i=G[i].next){
//            int to=G[i].to;
//            if(dis[to]>dis[v]+G[i].w){
//                dis[to]=dis[v]+G[i].w;
//                t.x=to;
//                t.w=dis[to];
//                p.push(t);
//            }
//
//        }
//    }
//    int m1=-1;
//        int m2=-1;
//        dis[s]=-3;
//        for(int i=1;i<=n;i++){
//            if(dis[i]==INF) continue;
//            if(dis[i]>m1){
//                m2=m1;
//                m1=dis[i];
//            }
//            else if(dis[i]>m2){
//                m2=dis[i];
//            }
//        }
//        if(m1!=-1&&m2!=-1) return m1+m2;
//        return -1;
//
//}
//
//
//int main(){
//    int t;
//    cin>>t;
//    while (t--) {
//        cin>>n>>m;
//        int u,v,w;
//
//        for(int i=1;i<=m;i++){
//            cin>>u>>v>>w;
//            add(u,v,w);
//            add(v,u,w);
//        }
//        int ans=0;
//        int cnt=0;
//        for(int i=1;i<=n;i++){
//            ans=max(ans,dijkstra(i));
//        }
//        cout<<ans<<endl;
//    }
//}
//end


//e_cheak
//int vis[1000010];
//int prime[100010];
//int  e_cheak(int n){   //k为2-n素数的个数
//    for(int i=0;i<=n;i++){
//        vis[i]=0;
//    }
//    for(int i=2;i*i<=n;i++){
//        if(!vis[i]){
//            for(int j=i*i;j<=n;j+=i){
//                vis[j]=1;
//            }
//        }
//    }
//    int k=0;
//    for(int i=2;i<=n;i++){
//        if(!vis[i])
//            prime[k++]=i; //统计素数
//    }
//    return k;
//}
//
////进制转化 x转化为y进制
//string work(int x,int y){
//    string str="";
//    while(x){
//        if(x%y>=10) str+=x%y+'A'-10;
//        else str+=x%y+'0';
//        x/=y;
//    }
//    reverse(str.begin(),str.end());
//    return str;
//}
//
//
//const int MAX=1000005;
//char str[MAX];
//char pattern[MAX];
//int cnt;
//int Next[MAX];
//void  getnext(string p,int plen){
//    Next[0]=0;
//    Next[1]=0;
//    for(int i=1;i<plen;i++){
//        int j=Next[i];
//        while (j&&p[i]!=p[j]) {
//            j=Next[j];
//        }
//        Next[i+1]=(p[i]==p[j])?j+1:0;
//    }
//}
//int kmp(string s,string p){
//    int last=-1;
//    int slen=s.length();
//    int plen=p.length();
//    getnext(p,plen);
//    int j=0;
//    for(int i=0;i<slen;i++){
//        while (j&&s[i]!=p[j]) {
//            j=Next[j];
//        }
//        if(s[i]==p[j]) j++;
//        if(j==plen){
//            //start
//            return 1;
//            //end
//        }
//    }
//    return 0;
//}
//int main(){
//    int n;
//    cin>>n;
//    string t;
//    string s="";
//    for(int i=2;i<=16;i++){
//        s="";
//        s+=work(n,i);
//        if(kmp(s,t))
//        {
//            cout<<"yes";
//            return 0;
//        }
//    }
//    cout<<"no"<<endl;
//    return 0;
//}


//string s1,s2;
//int main(){
//    cin>>s1;
//    s2="cocacola";
//    int ans;
//    for(int i=0;i<s1.length();i++){
//        if(s1[i]!=s2[i])
//            ans++;
//    }
//    cout<<ceil(ans/2);
//}

int n,m;
const int MAX=2e5+10;
int fa[MAX];
int rk[MAX];

struct node{
    int a,b,c;
    bool operator < (const node &a)const{
        return this->c <a.c; //先选黑边 能连就连
    }
}Node[MAX];
void init(){
    for(int i=1;i<=n;i++){
        fa[i]=i;
    }
}
int find(int x){
    if(x==fa[x]) return  x;
    return fa[x]=find(fa[x]);
}
void Union(int x,int y){
    if(find(x)==find(y)) return;
    else {
        fa[find(x)]=find(y);
    }
}
int main(){
    cin>>n>>m;
    init();
    for(int i=0;i<m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        Node[i]={a,b,c};
    }
    sort(Node,Node+m);
    int ans=0;
    for(int i=0;i<m;i++){
        int x=Node[i].a;
        int y=Node[i].b;
        if(find(x)!=find(y)){
            Union(x,y);
            if(Node[i].c){
                ans++;//用到了白边 ++
            }
        }
    }
    set<int> s;
    for(int i=1;i<=n;i++){
        s.insert(find(i)); 
    }
    if(s.size()==1)  cout<<ans; //最后于一个顶点
    else cout<<-1;
}
一行一个整数, 表示最少的白边数量。如果不能满足题目条件,输出 -1

示例1

输入

复制

4  4
1 2 0
2 3 0
3 4 1
1 4 0

输出

复制

0

Level 4自动驾驶系统设计0——功能与场景0 摘要:当前智能驾驶系统开发存在应试思维误区,过度依赖NCAP标准测试而忽视真实物理世界的复杂工况。随着系统进入L4大模型时代,必须从离散测试转向应对无限连续的长尾场景。关键在于解决传感器输入质量(避免"垃圾进垃圾出"问题),通过逆向定义方法论确保前端数据高置信度。同时采用影子模式收集分歧数据流,结合条件接受机制动态调整感知权重,最终实现功能释放主权(FO)的100%安全闭环。本文揭示了如何为端到端智驾大模型建立物理红线,这是确保L4系统量产的底层法则。 阅读详情

相关推荐

ur3手眼标定+realsenseL515

知乎 csdn

AI_future的博客 978

C++使用min,max过程中出现无法找到标识符的问题

1、出问题的原因以及解决方案 (1)可能存在多种库包含using namespace std;等相关的min,max库,引起的冲突。 解决方案:尽量少直接使用using naspece std;命名空间,可以使用std::min,或者std::max作用于来操作。 (2)可能存在min,max里面的参数类型不一致引起的问题。 例如 int num1 = 100; long num2 = 1000; std::min(num1,num2); 在上述例子中,就会出现min报错,可以通过将min函数里面的参数强

平凡 8752

服务器安全配置:二、本地安全策略设置

密码最长使⽤期限”设置为“90天”;“⽤可以还原的加密来存储密码”设置为“禁⽤”“复位账户锁定计数器”设置为15分钟,贴图这里是我自己设置的时间,15分钟也够用,具体看自己需要。”网络访问: 不允许 SAM 帐户和共享的匿名枚举“设置为“已启用””网络访问: 限制对命名管道和共享的匿名访问“设置为“已启用””网络访问: 不允许匿名枚举 SAM 帐户“设置为“已启用”“关机: 允许系统在未登录的情况下关闭”设置为“已禁用”(1)交互式登录:不显示最后的⽤户名”设置为“已启⽤”

weixin_48825672的博客 3135

UVA-10935 Throwing cards away I

#include<iostream> #include<algorithm> #include<cmath> #include<iomanip> #include<string> #include<cassert> #include<cctype> #include<memory.h> #include<cstdio> #include<sstream> #include<vect.

努力写代码的小柯基的博客 307

【2025年华为秋招(AI)-11月19日-第二题(200分)- 终端款型聚类识别】(题目+思路+Java&C++&Python解析+在线测试)

该摘要总结了题目要求、输入输出格式、KMeans算法的实现步骤以及关键点。以下是150字内的摘要: 本文提出基于KMeans算法对终端型号进行聚类的方法。通过包间隔时长、连接持续时长、漫游前后信号强度4个特征,使用欧氏距离度量相似度。算法采用固定初始化策略(前k个样本作为初始质心),经过分配-更新迭代,直至质心移动小于1e-8或达到最大迭代次数。最终输出各簇样本数并按升序排列,解决了终端型号自动分类问题。示例显示该方法能有效识别3-4类终端,并准确统计每类数量。

m0_73659489的博客 141

SMPLify-x-master | 复现记录

由于毕业设计中将会用到smpl模型,而smplify方法的各环境依赖版本比较老,复现不太容易,因此便进行了smplifyx方法使用smplx的方法。由于在过程中遇到较多坑,因此进行记录和分享。

qq_44916003的博客 5100

[CSP冲刺]代码常见错误总结

CSP冲刺——代码常见错误总结

Panda_Hu's blog 3055

到底什么是指令集?什么是微架构?他们是什么关系?

指令集、处理器架构、芯片厂商、ARM、x86,其间关系还在迷糊吗?一文迅速理清!!

车载系统攻城狮 7811

小白笔记:编程常出疑难错误

小白编程的自我修养

xungegeer的博客 228

基于Simulink环境,提供一个关于如何对EMI抑制的DC-DC变换器进行仿真建模的示例

EMI定义:电磁干扰是指任何能中断、阻碍、降低或限制电气设备有效性能的电磁能量。重要性合规性:确保产品符合国际和地方的EMC标准。可靠性:减少因外部或内部EMI导致的系统故障风险。挑战滤波设计:合理设计输入输出滤波器以抑制传导EMI。布局与接地:良好的PCB设计对于减少辐射EMI至关重要。屏蔽:使用金属屏蔽来保护敏感电路不受外界干扰。首先明确要模拟的任务内容。设计一个能够在高频操作下有效抑制EMI的DC-DC变换器。根据工作频率和谐振元件值确定合适的滤波器参数。

xiaoheshang_123的博客 146

手把手教你双目测距理论及生成视差图,深度图,点云图像

Stereo Vision, 也叫双目立体视觉,它的研究可以帮助我们更好的理解人类的双眼是如何进行深度感知的。双目视觉在许多领域得到了应用,例如城市三维重建、3D模型构建(如kinect fusion)、视角合成、3D跟踪、机器人导航(自动驾驶)、人类运动捕捉(Microsoft Kinect)等等。双目测距也属于双目立体视觉的一个应用领域,双目测距的基本原理主要是三角测量原理,即通过视差来判定物体的远近。

qq_53545309的博客 2280

第25次CCF计算机软件能力认证——未初始化警告

出现过,即存在 j

liu1526246800的博客 263

大数据在电力行业的应用案例解析-【电力技术】(九)大数据在电力储能运维中的深度应用(含故障预测代码)

大数据技术为电力储能运维提供了“精准化、智能化、高效化”的解决方案,破解了传统运维的核心痛点,实现了储能系统从“被动抢修”到“主动运维”的转型,为新型电力系统建设提供了重要支撑。当前,随着储能产业的快速发展,大数据与储能运维的融合将更加深入,未来将结合人工智能、物联网、区块链等技术,实现储能运维的全流程智能化——从设备故障的提前预警,到寿命的精准预测,再到运维策略的自动优化、调度协同的实时响应,进一步提升储能系统的安全性、经济性与可靠性。

getusushu的博客 87

Codeforces 1156D 0-1-Tree(并查集)

传送门 题意:给一棵n个点,边被黑白染色的树,问有多少对点对满足从x沿最短路径走到y,经过白边(1-edges)后不经过黑边(0-edges)。 题解:开两个并查集,第一个只连黑边,第二个只连白边,讨论三种路径:①黑②白③黑转白。前两种在并查集merge的时候可以计算,第三种路径怎么搞?对于某个点x,经过它的第三种路径有条。为什么这么不会算重,因为树是没有环的(脑补一下似乎没毛病)。 做完发现可以不用讨论,直接。减去那个1就是去掉(pos, pos)这条路径。 WA了好久发现应该find的地方写成了

KGV093的博客 425

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

HDU 4786 生成树 并查集+极大极小值 黑白边 确定选择白边的数量

题意: 给定一个无向图 n 个点 m条无向边 u v val val == 1 表示边(u, v) 为白边 问能否找到n个点的生成树, 使得白边数为斐波那契数 思路: 并查集求图是否连通( 是否存在生成树) 求出 最多白边树 的 白边数量 求出 最少白边树 的 白边数量 若[最少, 最多] 区间内存在斐波那契数 ,则满足条件 (也就是说,白边的数量是连续有解...

weixin_30590285的博客 92

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

bzoj 3319 黑白树 并查集 or 树链剖分

Description给定一棵树,边的颜色为黑或白,初始时全部为白色。维护两个操作:1.查询u到根路径上的第一条黑色边的标号。 2.将u到v 路径上的所有边的颜色设为黑色。Notice:这棵树的根节点为1Input第一行两个数n,m分别表示点数和操作数。 接下来n-? 1行,每行2个数u,v.表示一条u到v的边。 接下来m行,每行为以下格式:1 v 表示第一个操作2 v u 表示第

liangzihao1的博客 322

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【BzoJ 3319】【黑白树】【并查集】【”猥琐欲为“】

最近迷上了一个叫splatoon的游戏呢最近做了几道并查集的题,完全被虐成狗了。。。才明白如果并查集考灵活会这么难啊。。。3319: 黑白树Time Limit: 10 Sec Memory Limit: 512 MBDescription给定一棵树,边的颜色为黑或白,初始时全部为白色。维护两个操作:1.查询u到根路径上的第一条黑色边的标号。 2.将u到v 路径上的所有边的颜色设为黑色。N

22ssm的博客 715

BZOJ 3319: 黑白树 树+并查集+未调完+神题

BZOJ 3319: 黑白树 树+并查集+未调完+神题 Code: #include<bits/stdc++.h> #define maxn 1000003 using namespace std; char *p1,*p2,buf[100000]; #define nc() (p1==p2&&(p2=(...

EM LGH 143

2946.最小黑白树生成(代码)

之前我没放代码,现在。

m0_64569200的博客 265

BZOJ 3319 并查集 解题报告

3319: 黑白树Description给定一棵树,边的颜色为黑或白,初始时全部为白色。维护两个操作: 1.查询u到根路径上的第一条黑色边的标号。 2.将u到v 路径上的所有边的颜色设为黑色。 Notice:这棵树的根节点为1Input第一行两个数n,m分别表示点数和操作数。 接下来n-? 1行,每行2个数u,v.表示一条u到v的边。 接下来m行,每行为以下格式: 1 v 表

onepointo 396

2013成都站F题||hdu4786 并查集 生成树

http://acm.hdu.edu.cn/showproblem.php?pid=4786 Problem Description   Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do some research on Spanning Tree. So Coach Pan

ACM,再见! 1300

hdu 4786 Fibonacci Tree(并查集)

题目链接:hdu 4786 Fibonacci Tree解题思路首先判断是否可以连通,然后对黑白边分别做并查集连通求连通分量,连通分量即为对应白黑边必须选的边数。代码#include <cstdio> #include <cstring> #include <vector> #include <algorithm>using namespace std; const int maxn = 1e5 +

不慌不忙、不急不躁 523

CODE FESTIVAL 2017 qual B:C - 3 Steps 并查集判二分图、二分图性质

题目链接 题意:给一个连通的无向图,让我们往距离为三的两个不同的点添加一条边,问最终能够添加多少条边 比赛时做的没想法,官方题解讲得很清楚假设在ss和t之间存在一条长度为奇数的路径,也就是说对于某个奇数t之间存在一条长度为奇数的路径,也就是说对于某个奇数k,存在一个点的序列,存在一个点的序列s=v0,v1,...,vk=t=v_0,v_1,...,v_k=t(viv_i和vi+1v_{i+1}相

kyoma的博客 377

ACM 预备队训练第九周 图论初步

所以,对于这一个图的点的选法,可以考虑到相邻的点染成不同的颜色。于是,对于一个连通图,要不就只有两种选法(因为可以全部选染成一种色的,也可以全部选染成另一种色的),要不就是impossible!思路:可以使用 dfs(深度优先搜索)求解,求出 u 到 v 间的每一条路径,将路径总数统计,并将被经过的点被经过总数加一。/*本题思路:所有的边全部给出,按照时间顺序更新每一个可用的点(即修建好村庄),对于每个时间点进行两点之间询问,至于压缩路径,fa()与f[]其实他们的压缩路径就是记忆化的斐波那契数列的思路。

LYB0130的博客 175

CCPC2018 湖南全国邀请赛补题(DP/并查集/最长上升子序列)(H待补)

D 比赛时的思路是计数,没有想到DP,现在一想其实DP的挺明显的。 这个思路是网上一个我看的比较明白的思路。 题解: 1. 直接把整个环看成相同数目的黑白段的连接(必定是相同数目)。 2. 用DP计算将i个数分解成j段的所有分发的乘积和,,dp的时候用前缀和和滚动数组优化。 3.拼接的时候后取模。 #include<bits/stdc++.h> #define MOD ...

oidoidoid的博客 322
上一篇: Anniversary party(树上dp)
下一篇: dd爱框框(滑动窗口)
郭晋龙
博客等级 码龄6年 940粉丝 449原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭晋龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值