gplt L2-010. 排座位(普通并查集)

来源:互联网 发布:郑州网络推广外包 编辑:程序博客网 时间:2024/04/27 23:27


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;}


0 0