列表

详情


NC214355. 黑白边

描述

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

输入描述

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

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

输出描述

一行一个整数, 表示最少的白边数量。如果不能满足题目条件,输出 -1

示例1

输入:

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

输出:

0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 46ms, 内存消耗: 3848K, 提交时间: 2021-02-24 08:06:13

#include<bits/stdc++.h>
using namespace std;

int L=0,x[200005],y[200005],V[200005];
int find(int a)
{
	if(a==V[a])return a;
	return V[a]=find(V[a]);
}
int main()
{
	int i,a,b,n,m,z,s=0,ans=0;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)V[i]=i;
	while(m--)
	{
		scanf("%d%d%d",&x[L],&y[L],&z);
		if(z)L++;
		else 
		{
			a=find(x[L]),b=find(y[L]);
			if(a!=b)s++,V[a]=b;
		}
	}
	for(i=0;i<L;i++)
	{
		a=find(x[i]),b=find(y[i]);
		if(a!=b)s++,ans++,V[a]=b;
	}
	if(s!=n-1)ans=-1;
	printf("%d\n",ans);
    return 0;
}

上一题