7-10 排座位 PTA

思想: 运用并查集与一个二维数组。
// 朋友的朋友就是我的朋友,敌人的朋友不一定是我的敌人 这两个点是可以用并查集的。

因为在找两个人的关系时,在一个集合类的肯定是朋友,否则就是没关系或敌人, 是否为敌人只需看二维数组是否为-1, -1表示敌人, 0 表示没关系。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <stdio.h>
using namespace std;
int pre[101];
int g[101][101];
int n,k,m;
int getroot(int t) // 找到树根,并缩短路径
{
    if(pre[t] == t) return t;
    return pre[t] = getroot(pre[t]);
}
int join(int t1,int t2) // 将两个不同的集合放在一起
{
    int a = getroot(t1);
    int b = getroot(t2);
    if(a != b)
        pre[a] = b;
}
int main()
{
    memset(g,0,sizeof(g)); //初始化为任意两人之间都是没关系的。
    cin >> n >> k >> m;
    for(int i = 0; i <= n; i++) //初始化根都为自己
        pre[i] = i;

    for(int i = 0; i < k; i++)
    {
        int t1,t2,connect;
        cin >> t1 >> t2 >> connect;
        g[t1][t2] = connect; //重新定义二者之间的关系
        g[t2][t1] = connect; //重新定义二者之间的关系
        if(connect != -1)  // 关系不为 -1, 则为1, 那么就加到一个朋友圈中
            join(t1,t2);
    }

    for(int i = 0; i < m; i++)
    {
        int t1,t2;
        cin >> t1 >> t2;

        if(g[t1][t2] == -1)
        {
            if(getroot(t1) == getroot(t2))
                cout << "OK but..." << endl;
            else
                cout << "No way" << endl;
        }
        else if(getroot(t1) == getroot(t2))
            cout << "No problem\n";

        if(g[t1][t2] == 0)
            cout << "OK" << endl;;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值