リンク:
https://vjudge.net/problem/Gym-100923H
質問の意味:
OberynマーテルとグレゴールCleganeは戦闘によって裁判で決闘しています。Tyrion Lannisterの生活がライン上にあるような戦いは、非常に重要です。Oberynとグレゴールは戦闘で自分のスキルにWesterosに2つの最高の戦闘機はできる唯一の方法は、スタークラフトの試合を測定しています。ポルCostel豚以外なしで試合を監督1。
Oberynとグレゴールは両方テランを果たしている、と彼らは海兵隊の軍隊を持つマップ、それぞれの中央でお互いに直面します。残念ながら、豚はポルCostelはプレーヤーどの属する海洋把握することはできません理由だけでなく、つまり、色を区別することはできません。彼が見るすべては、マップの中央に海兵隊と、時間から時間に、お互いを撮影2人の海兵隊です。また、ポルCostelの想像力は、彼にトリックを再生しますケースかもしれないと彼は時々2人の海兵隊は、彼らがなくてもお互いを撮影していると思います。
人々はポルCostelは、この重要な仕事のための右の人であるかどうかを疑問視し始めています。これらの疑問を取り除くために私たちの使命です。あなたはポルCostelの観測が与えられます。観察はポルCostelは、海洋と海洋がお互いを撮影していることを見ているという事実にあります。私たちは同じチームで海兵隊(Oberynのか、グレゴールのは)お互いを撃つことはできないことを知っています。あなたの仕事は、それが右であるかどうかと言って、各観測のための評決を与えることです。
ポルCostelの観測がtrueこの観察を考慮して、真のこの時点までのすべての正しい観察を考慮すると、もし正しいと考えられているから、このようなことがない2人の海兵隊の「グレゴールのチームを」「Oberynのチーム」での海兵隊とを分割する方法があります同じチームは、これまでお互いを撮影しました。それ以外の場合は、観察が正しくないと考えられています。
「イーリアマーテルは!!!あなたは、あなたが彼女をcheesed!彼女を急いで!あなたは彼女のSCVを殺しました!」
アイデア:
加重互いに素-設定し、ルートノードの各ノードとの関係を維持し、それが0にやさしい、1は、敵であります
コード:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
//#include <memory.h>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <math.h>
#include <stack>
#include <string>
#include <assert.h>
#include <iomanip>
#define MINF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 1e5+10;
int Fa[MAXN], Level[MAXN];
int n, m;
int GetF(int x)
{
if (Fa[x] == x)
return x;
int tmp = Fa[x];
Fa[x] = GetF(Fa[x]);
Level[x] = Level[x]^Level[tmp];
return Fa[x];
}
//1 1 3
//0 1 0
//1 2 3
//0 same 1 diff
int main()
{
// freopen("meciul.in", "r", stdin);
// freopen("meciul.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while (t--)
{
cin >> n >> m;
for (int i = 1;i <= n;i++)
Fa[i] = i, Level[i] = 0;
int l, r;
while (m--)
{
cin >> l >> r;
int tl = GetF(l);
int tr = GetF(r);
if (tl != tr)
{
Level[tr] = 1^Level[l]^Level[r];
Fa[tr] = tl;
cout << "YES" << endl;
}
else
{
if (Level[l] == Level[r])
cout << "NO" << endl;
else
cout << "YES" << endl;
}
// for (int i = 1;i <= n;i++)
// cout << Level[i] << ' ' ;
// cout << endl;
}
}
return 0;
}