HDU 3038 ¿Cuántos respuestas son erróneos Problema Solución informe ponderada disjuntos-set

HDU 3038 ¿Cuántos respuestas son erróneos Problema Solución de Informe

Ideas resolución de problemas: significado de las preguntas que se le da intervalos y varios conjuntos, habrá varios grupos de datos erróneos, por lo que se calcula el número de conjuntos de datos erróneos, cuando los dos conjuntos de conflicto de datos, un primer conjunto de datos dado es correcta. Con disjuntos-set, mientras continúa para actualizar cada nodo y los pesos de raíz (pesos y puede ser negativo), mientras que la última nota con n entradas y m, de lo contrario wa. Mirar el código, añade una nota.
Aquí Insertar imagen Descripción

#include <stdio.h>
#include<iostream>
#include <algorithm>
#include<string.h>
#include<cmath>
#pragma warning(disable:4996)
#define mod 1000000007
#define ll unsigned long long
const int N = 200005;
using namespace std;
int sum[N];//记录某点到其根节点的权值和,注意不是前缀和
int father[N];
int find(int x)
{
	if (x != father[x])
	{
		int tem = father[x];//记录x的上一级
		father[x] = find(father[x]);//更新最高上级,即路径压缩
		sum[x] += sum[tem];//记录权值和
	}
	return father[x];
}
int main()
{
	int ans, n, m;
	while (~scanf("%d%d", &n, &m))
	{
		ans = 0;
		memset(sum, 0,sizeof(sum));
		for (int i = 0; i <= n; i++)
		{
			father[i] = i;
		}
		int head, ed, val;
		while (m--)
		{
			scanf("%d%d%d", &head, &ed, &val);
			head--;//因为后面要用sum减出区间和,所以开头减1,这样减出来的值就包括在head位置的数
			int fh = find(head);
			int fe = find(ed);
			if (fh == fe)
			{
				if (sum[head] - sum[ed] != val)
					ans++;
			}
			else
			{
				father[fh] = fe;
				sum[fh] = val + sum[ed] - sum[head];//注意到根节点的值可能是负值
			}
		}
		printf("%d\n", ans);
	}
}


Publicado 64 artículos originales · ganado elogios 0 · Vistas 1439

Supongo que te gusta

Origin blog.csdn.net/weixin_45566331/article/details/105057121
Recomendado
Clasificación