[説明] &&互いに素なセット食物連鎖

トピックポータル

件名の説明:

動物界A、B、Cの動物の3種類があり、動物の食物連鎖の3つのタイプが面白い環を構成します。食品Bは、BがCを食べ、C Aを食べます 動物の前N、1-Nの数。各動物は親切で、B、Cであるが、我々は最終的にはそれを知らないの種類です。これは、N説明から成るこの栄養動物の2つのバージョンを用いて行った:
最初の引数は「1 XY」であり、それがXを表し、Yは類似しています。
第2引数は「2 XY」であり、XはYを食べる表します
上記の二つの文を有するN個の動物のためのこの人は、文ずつの文はこの文、いくつかの真のいくつかの偽のK、Kを避けます。以下の三つの言葉の一つ、この文は嘘である場合には、真実はそうです。
1)現在の真の場合、前の競合のいくつかは、嘘である;
2)、次いで、現在のXまたはYがNよりも大きい場合、嘘である;
3)Xは、現在のX、食べる表し、嘘です。
ジョブは、N(1 <= N <=に従って与えられ 50,000) とKワード(0 <= K <= 100,000 )、 出力嘘の総数。


入力フォーマット
最初の二行のスペースで区切られた整数NおよびKです。K次の3行はそれぞれ、Dは、引数の型を示す二つの数字の間のスペースで区切られた正整数D、X、Y、です。D = 1の場合は、XとYが類似していることを示しています。D = 2の場合、XはYを食べる表します

出力フォーマット
嘘の数を表す唯一の整数。


分析:

タイトルの意味は、実際に関係を持つ複雑な契約です後にこの質問を転換されます。
この質問に対処する必要があるため、同様の 食品 捕食者の関係。

処理との関係を考えて、我々は、2つの方法を考えるかもしれません。 マップ マップ 検索 互いに素セット
することができませんされていないグラフの問題を、どうやらとのトラブルよりも互いに素をセット。
だから、この質問は、調査と収集の対象です。

  • このとき、どのようなばらばらのセットの導入 スプレッド 展示会 ドメイン 拡張フィールド 概念。
    実際には、より多くのディスジョイントセットの関係に対処する共同

だから、質問の意味我々は、3互いに素セット与える見つけることができる、それが長いと3倍にばらばらセットの長さを延長、です。
注意:これは、それらの間に共通の基盤がないため、複数のばらばらのセットの関係を保存するために使用しないことをお勧めですが、また、処理エラーとの関係が発生したため(つまりはそう............を欠場すること、です)

私たちは次の場所にあります。
F A [ ] テーブル ショー とともに あります 編集します 番号 FA [i]は私が父の数で表され
1 オフィス 理由 とともに カテゴリ シャット 部門   ( 1 &lt; = i &lt; = n ) 図1は、処理同様の関係がI(1&LT; = I |≦N)\
2 i   ( n + 1 &lt; = i &lt; = 2 n ) 2、iは\天敵の処理との関係(N + 1 |≦I |≦2 * N)
3 i ( 2 n + 1 &lt; = i &lt; = 3 n ) 3、食品との関係は、I処理した(2 * N + 1 |≦I |≦3×n個)

だから、タイトルは、その後どのように前回のカウント、それとの競合について、語と競合する前に言いたいことが嘘のですか?
4例があります。
1 1、同じ種類を食べます
2 2、類似した食捕食者
3 3、及び捕食者は類似しています
4 4、そして食べ物が似ています

だから、長い間私たちの関係は、上記の4つに従って処理することができますよう。


コード

/*
1、同类吃同类
2、同类吃天敌
3、和天敌是同类
4、 和食物是同类 

1-n 同类
n+1-2*n 天敌
2*n+1-3*n 食物
*/
#include<bits/stdc++.h>
using namespace std;
int fa[1000001];
int n,m;
int ans=0;
int getfa(int k){
    return k==fa[k]?k:fa[k]=getfa(fa[k]);
}
int main(){
	freopen("eat.in","r",stdin);
	freopen("eat.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n*3;i++) fa[i]=i;
    for (int i=1,x,y,z;i<=m;i++){
		scanf("%d %d %d",&z,&x,&y);
		if (x>n||y>n) {ans++;continue;}
		if (z==2&&x==y) {ans++;continue;}
		if (z==1){
			if (getfa(x+n)==getfa(y)&&x!=y) {ans++;continue;}//3
			if (getfa(x+2*n)==getfa(y)&&x!=y) {ans++;continue;}//4
			fa[getfa(x)]=getfa(y);
			fa[getfa(x+n)]=getfa(y+n);
			fa[getfa(x+2*n)]=getfa(y+2*n);
		}
		if (z==2){
			if (getfa(x)==getfa(y)) {ans++;continue;}//1
			if (getfa(x+n)==getfa(y)) {ans++;continue;}//2
			fa[getfa(x)]=getfa(y+n);
			fa[getfa(x+n)]=getfa(y+2*n);
			fa[getfa(x+2*n)]=getfa(y);
		}
	}
	printf("%d",ans);
	fclose(stdin);
	fclose(stdout);
	return 0;
}

おすすめ

転載: blog.csdn.net/huang_ke_hai/article/details/88864128