天梯赛 L2-010 排座位
还是比较简单的一道题,思路就是并查集 + map<int,map<int,int>>,其中并查集用来把所有是朋友的放到一起,map用来存储两个人是否是敌人
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
typedef long long ll;
const int N = 110;
const int mod = 998244353;
int n,m,k;
int fa[N];
int find(int x){
if(fa[x] == x){
return x;
}
return fa[x] = find(fa[x]);
}
void merge(int x,int y){
int xx = find(x),yy = find(y);
if(xx == yy){
return;
}
fa[yy] = xx;
}
void solve() {
cin>>n>>m>>k;
for(int i = 0 ; i <= 100 ; i++){
fa[i] = i;
}
map<int,map<int,int>> mp; //记录两个人是不是死对头
for(int i = 0 ; i < m ; i++){
int x,y,op;
cin>>x>>y>>op;
if(op == 1){
merge(x,y);
}else{
mp[x][y] = 1;
mp[y][x] = 1;
}
}
for(int i = 0 ; i<k ; i++){
int x,y;
cin>>x>>y;
if(mp[x][y] == 0 && find(x) == find(y)){
cout<<"No problem"<<endl;
}else if(mp[x][y] == 0 && find(x) != find(y)){
cout<<"OK"<<endl;
}else if(mp[x][y] == 1 && find(x) == find(y)){
cout<<"OK but..."<<endl;
}else{
cout<<"No way"<<endl;
}
}
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int tt = 1;
// cin >> tt;
while (tt--) {
solve();
}
return 0;
}