トピックリンク
https://pintia.cn/problem-sets/994805046380707840/problems/994805066135879680
アイデア
友達と友達の関係については、ユニオンサーチで維持できます。敵同士の関係については、直接の敵対関係だけが敵なので、2次元の配列またはマップを使用するだけで維持できます。そして、問い合わせごとに、友情と敵意に応じて分類し、話し合うことができます。
コード
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f
const int N = 1e2+10;
int fa[N],n,m,k;
bool enmy[N][N];
int find(int x){
return x==fa[x]?x:find(fa[x]);
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
for(int i = 1;i <= n; ++i) fa[i] = i;
int u,v,w;
for(int i = 1;i <= m; ++i) {
cin>>u>>v>>w;
if(w + 1) {
u = find(u);
v = find(v);
fa[v] = u;
} else {
enmy[u][v] = enmy[v][u] = true;
}
}
for(int i = 1;i <= k; ++i) {
cin>>u>>v;
if(enmy[u][v]) {
if(find(u) == find(v)) cout<<"OK but..."<<endl;
else cout<<"No way"<<endl;
} else {
if(find(u) == find(v))
cout<<"No problem"<<endl;
else cout<<"OK"<<endl;
}
}
return 0;
}