程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 3038 How Many Answers Are Wrong (帶權並查集+區間判斷)

HDU 3038 How Many Answers Are Wrong (帶權並查集+區間判斷)

編輯:C++入門知識


題意:給你長度為n的區間,m個詢問:a,b,c,問這m個問題有多少個是錯誤的(矛盾)。


10 5
1 10 100
7 10 28
1 3 32
4 6 41
6 6 1

由6->6=1, 4->6=41 知4->5=40;

同理 由1->10=100,7->10=28 知1->7=72;

又由1->3=32,4-6=41 知1->7=73,與上面矛盾;

所以答案為1;


#include
#include
#include
#include
#include
#include
#include
#include 
#include 
#include
#include
using namespace std;
#define INF 1e8
#define eps 1e-8
#define LL long long
#define maxn 100001
#define PI acos(-1.0)

int father[2*maxn];
int sum[2*maxn];
int find(int x)
{
	if(x==father[x])
		return x;
	int t=father[x];
	father[x]=find(father[x]);
	sum[x]+=sum[t];
	return father[x];
}
int main()
{
	int n,m;
	while(~scanf("%d%d",&n,&m))
	{
		int a,b,c;
		for(int i=0;i<=n;i++)
		{
			father[i]=i;
			sum[i]=0;
		}
		int ans=0;
		while(m--)
		{
			scanf("%d%d%d",&a,&b,&c);
			int x,y;
			a--;
			x=find(a);
			y=find(b);
			if(x==y)
			{
				if(sum[a]-sum[b]!=c)
					ans++;
			}
			else if(x>y)
			{
				father[y]=x;
				sum[y]=sum[a]-sum[b]-c;
			}
			else 
			{
				father[x]=y;
				sum[x]=sum[b]-sum[a]+c;
			}

		}
		printf("%d\n",ans);
	}
	return 0;
}
/*
10 5
1 10 100
7 10 28
1 3 32
4 6 41
6 6 1
*/




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved