https://www.patest.cn/contests/gplt/L2-010
题意:中文题。
思路:刚开始一看两者之间关系有多种,还以为是带权并查集,后来想想天梯赛不都是裸题么。。只需要将是朋友关系的合并成一个集合,非朋友关系的用矩阵表达,两判断条件相与即可。
ps:晕着头敲的,起太早了。。
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 105;
const int INF = 0x3f3f3f3f;
int pre[N], relation[N][N];
int Find(int x)
{
int r = x;
while(r != pre[r])
r = pre[r];
int i = x;
while(pre[i] != r)
{
int tmp = pre[i];
pre[i] = r;
i = tmp;
}
return r;
}
void Union(int p1, int p2)
{
int x = Find(p1);
int y = Find(p2);
if(x != y)
{
pre[x] = y;
}
}
void init()
{
memset(relation, 0, sizeof(relation));
for(int i = 1; i <= N; i++)
pre[i] = i;
}
int main()
{
// freopen("in.txt", "r", stdin);
int n, m, k, x, y, val;
while(~scanf("%d%d%d", &n, &m, &k))
{
init();
for(int i = 1; i <= m; i++)
{
scanf("%d%d%d", &x, &y, &val);
relation[x][y] = relation[y][x] = val;
if(val == 1) Union(x, y);
}
for(int i = 1; i <= k; i++)
{
scanf("%d%d", &x, &y);
if(Find(x)==Find(y) && relation[x][y]!=-1 && relation[y][x]!=-1) printf("No problem\n");
else if(Find(x)!=Find(y) && relation[x][y]!=-1 && relation[y][x]!=-1) printf("OK\n");
else if(Find(x)==Find(y) && (relation[x][y]==-1 || relation[y][x]==-1)) printf("OK but...\n");
else if(Find(x)!=Find(y) && relation[x][y]==-1 && relation[y][x]==-1) printf("No way\n");
}
}
return 0;
}