首页 > 其他分享 >团体天梯练习 L2-010 排座位

团体天梯练习 L2-010 排座位

时间:2023-04-17 13:11:19浏览次数:39  
标签:typedef int find 010 朋友 L2 include 排座位 敌对

L2-010 排座位

布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。

输入格式:

输入第一行给出3个正整数:\(N(≤100)\) ,即前来参宴的宾客总人数,则这些人从 \(1\) 到 \(N\) 编号; \(M\) 为已知两两宾客之间的关系数;\(K\) 为查询的条数。随后 \(M\) 行,每行给出一对宾客之间的关系,格式为:宾客\(1\) 宾客\(2\) 关系,其中关系为1表示是朋友,\(-1\) 表示是死对头。注意两个人不可能既是朋友又是敌人。最后 \(K\) 行,每行给出一对需要查询的宾客编号。

这里假设朋友的朋友也是朋友。但敌人的敌人并不一定就是朋友,朋友的敌人也不一定是敌人。只有单纯直接的敌对关系才是绝对不能同席的。

输出格式:

对每个查询输出一行结果:如果两位宾客之间是朋友,且没有敌对关系,则输出 \(No\) \(problem\);如果他们之间并不是朋友,但也不敌对,则输出 \(OK\);如果他们之间有敌对,然而也有共同的朋友,则输出 \(OK\) \(but...\);如果他们之间只有敌对关系,则输出 \(No\) \(way\)。

输入样例:

7 8 4
5 6 1
2 7 -1
1 3 1
3 4 1
6 7 -1
1 2 1
1 4 1
2 3 -1
3 4
5 7
2 3
7 2

输出样例:

No problem
OK
OK but...
No way


解题思路

题中说需要判断两个人是否存在共同的朋友,对于这一点,只需要用并查集就可以了;至于敌对关系,注意题中说的“但敌人的敌人并不一定就是朋友,朋友的敌人也不一定是敌人。只有单纯直接的敌对关系才是绝对不能同席的”,这句话表明我们无需使用扩展并查集来确定两者的首领是否存在敌对关系,只需要用一个数组来记录两者是否存在敌对关系即可。我一开始自己写的时候没看到这句话,上来就扩展并查集,写了半天才发现不太对...

/*   一切都是命运石之门的选择  El Psy Kongroo  */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<cmath>
#include<functional>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<int, pii> piii;
typedef pair<double, double> pdd;
typedef pair<string, int> psi;
typedef __int128 int128;
#define PI acos(-1.0)
#define x first
#define y second
//int dx[4] = {1, -1, 0, 0};
//int dy[4] = {0, 0, 1, -1};
const int inf = 0x3f3f3f3f, mod = 1e9 + 7;

const int N = 110;
int fa[N], n, m, q;
bool g[N][N];   //存储敌对关系

int find(int x){
    return fa[x] == x ? x : (fa[x] = find(fa[x]));
}

void Union(int u, int v){
    int fu = find(u), fv = find(v);
    if(fu == fv) return;
    fa[fv] = fu;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    cin >> n >> m >> q;
    for(int i = 1; i <= n; i ++ ) fa[i] = i;
    while(m -- ){
        int u, v, c; cin >> u >> v >> c;
        if(c == 1) Union(u, v);
        else g[u][v] = g[v][u] = true;   //只需要存储单纯的敌对关系 无序扩展并查集
    }

    while(q -- ){
        int u, v; cin >> u >> v;
        int fu = find(u), fv = find(v);
        if(fu == fv){
            if(g[u][v]) cout << "OK but..." << endl;  //有共同朋友但敌对
            else cout << "No problem" << endl;        //有共同朋友且不敌对
        }else{
            if(g[u][v]) cout << "No way" << endl;     //无共同朋友但敌对
            else cout << "OK" << endl;                //无共同朋友 不敌对
        } 
    }

    return 0;
}

标签:typedef,int,find,010,朋友,L2,include,排座位,敌对
From: https://www.cnblogs.com/MAKISE004/p/17325521.html

相关文章

  • 团体天梯练习 L2-009 抢红包
    L2-009抢红包没有人没抢过红包吧……这里给出N个人之间互相发红包、抢红包的记录,请你统计一下他们抢红包的收获。输入格式:输入第一行给出一个正整数\(N(≤10^{4})\),即参与发红包和抢红包的总人数,则这些人从\(1\)到\(N\)编号。随后\(N\)行,第\(i\)行给出编号为\(i\)的......
  • 团体天梯练习 L2-008 最长对称子串
    L2-008最长对称子串对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定IsPAT&TAPsymmetric?,最长对称子串为sPAT&TAPs,于是你应该输出11。输入格式:输入在一行中给出长度不超过1000的非空字符串。输出格式:在一行中输出最长对称子串的长度。输入样例:IsPAT&TAP......
  • 团体天梯练习 L2-007 家庭房产
    L2-007家庭房产给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。输入格式:输入第一行给出一个正整数$N(≤1000)$,随后N行,每行按下列格式给出一个人的房产:编号父母\(k\)孩子1...孩子\(k\)房产套数总面积其中编号是每个......
  • 团体天梯练习 L2-001 紧急救援
    L2-001紧急救援作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快......
  • APP爬虫初阶之Pixel2刷机root
    pixel2刷机刷机准备lineageziptwrpimgmagiskzip(github上下的是APK,需要把后缀改为zip)刷机步骤首先需要一个底包,这里我用的出厂自带的google官方系统,没有重新刷入手机上打开usb调试,关闭屏幕超时锁屏,打开OEM锁手机完全关机,按住向下键重启(或者通过adbrebootbootl......
  • P3205 [HNOI2010]合唱队
    P3205[HNOI2010]合唱队区间DP——取一端思:根据题意我们发现,每次排队的时候,会出现两种情况当前排入的人(即初始队列最后一人)比初始队列中前一个人矮,排到最左边当前排入的人(同上)比初始队列中前一个人高,排到最右边可从初始队列最后一人切入。设置状态:\(f[l][r][0/1]\)......
  • ESP3D ESP32-C3 bulid时报错 'Serial2' was not declared in this scope
    ESP3D版本: 3.0.0-alpha3 错误原因: ESP32-C3只有两个port 解决方法一: github上最新的git已经解决了该问题,使用git获取最新版,不要下载Release的 解决方法二: 去掉Serial2serial_sevice.cpp中,  第40,41行将MAX_SERIAL的值......
  • windows10 安裝wsl2
    1下载wslwsl--install2下好后重启电脑,我的重启后就自动帮我下了如果没有自动下载wsl--install-dubuntu设置用户名密码4更新sudoaptupdatesudoaptupgrade按Y确认5安装WindowsTerminalPreviewWindowsTerminalPreviewsudoaptinstallwslussl......
  • 23.4.15 NOIP2010提高游记
    第一次做提高,之前做的都是普及,还是感觉挺难的,心态有点裂开。1.机器翻译这题首先一看就是一道模拟题目,要注意的是字典的内存问题,在超内存以后要减1,直接上代码:-),时间复杂度O(n)1#include<bits/stdc++.h>2#pragmaGCCopzimize(3)3usingnamespacestd;4inlinelon......
  • 基于L2-RLS算法的目标跟踪算法matlab仿真,可处理小范围遮挡问题
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要目标表观模型是跟踪器的重要组成部分,用来描述目标表观的特征.基于判别式模型的表观模型用来区分目标和背景;基于生成式模型的表观模型用来描述目标本身,提取出目标的特征.本文合理地融合了判别式模型和生成式模型......