レポート加重互いに素セットを問題解決に間違っているどのように多くの回答HDU 3038

レポートを解決間違った問題でどのように多くの回答HDU 3038

問題解決のアイデア:質問の意味が間隔や複数のセットが与えられますが、誤ったデータセットの数、データ競合の二組、正確である与えられたデータの最初のセットを計算するので、誤ったデータのいくつかのグループが存在します。互いに素なセットと、(重みおよび負であってもよい)は、各ノードとルートの重みを更新し続けながら、n個の入力とM、さもなければWAとの最後のノートがあります。コードを見て、メモを追加しました。
ここに画像を挿入説明

#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);
	}
}


公開された64元の記事 ウォンの賞賛0 ビュー1439

おすすめ

転載: blog.csdn.net/weixin_45566331/article/details/105057121