PTA 7-4 排座位(25 分)

7-4 排座位(25 分)

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

输入格式:

输入第一行给出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并查集,嘿嘿嘿
#include<bits/stdc++.h>
using namespace std;
int father[105];
int maps[110][110];
int n, m , k;
int finds(int x)
{
    if(x!=father[x]) father[x]=finds(father[x]);
    return father[x];
}
void combine(int x,int y,int t)
{
    if(t==1)
    {
        int a=finds(x);
    int b=finds(y);
    if(a==b)
        return;
    if(a<b)
        father[b]=a;
    else
        father[a]=b;
    }
    else
    {
        maps[x][y] = maps[y][x] = -1;
    }
}
void init()
{
    for(int i=0;i<=n;i++)
      father[i]=i;
}
int main()
{
   scanf("%d%d%d",&n,&m,&k);
   init();
   memset(maps,0,sizeof(maps));
   for(int i=1;i<=m;i++)
   {
       int x,y,t;
       scanf("%d%d%d",&x,&y,&t);
       combine(x,y,t);
   }
   int x,y;
   for(int i=0;i<k;i++)
   {
        cin>>x>>y;
        if(finds(x)==finds(y)&&maps[x][y]!=-1)
        {
            printf("No problem\n");
        }
        else if(finds(x)==finds(y)&&maps[x][y]==-1)
        {
            printf("OK but...\n");
        }
        else if(finds(x)!=finds(y)&&maps[x][y]==-1)
        {
            printf("No way\n");
        }
        else
            printf("OK\n");
   }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏书山有路勤为径

二叉树-最近的公共祖先

已知二叉树,求二叉树中给定的两个节点的最近公共祖先。 最近公共祖先: 两节点v与w的最近公共祖先u,满足在树上最低(离根最 远),且v,w两个节点都是u的子孙。...

842
来自专栏和蔼的张星的图像处理专栏

480. 二叉树的所有路径递归

讲真我见到递归真的是害怕,也没办法讲,这也是参考的别人的答案,过两天再让我写我可能就写不出来了,这个看了看理解了一点点,就先放在这里吧,也许写的多了就懂了也不一...

991
来自专栏WindCoder

数据统计第一弹-按时/天/周/月补全某一段时间的数据-Java核心逻辑

本代码均结合之前的发布的DateUtil使用,之后的mysql查询部分看心情发布,就这么任性~ ~

441
来自专栏Java技术

为什么MySQL数据库索引选择使用B+树?

在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出...

1761
来自专栏技术小黑屋

Java性能调优之容器扩容问题

在Java和Android编程中,我们经常使用类似ArrayList,HashMap等这些容器。这些容器少则存储几条,多则上千甚至更多。作为性能调优的一部分,容...

761
来自专栏coolblog.xyz技术专栏

TreeMap 源码分析

TreeMap最早出现在JDK 1.2中,是 Java 集合框架中比较重要一个的实现。TreeMap 底层基于红黑树实现,可保证在log(n)时间复杂度内完成 ...

5059
来自专栏别先生

使用java的Calendar工具类获取到本月的第一天起始时间和最后一天结束时间。

1、使用java的Calendar工具类获取到本月的第一天起始时间和最后一天结束时间。

742
来自专栏desperate633

LintCode 二叉树中的最大路径和题目分析代码

给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和)

742
来自专栏小狼的世界

Aptana的破解

最近写JS比较多,常常苦恼与没有一个顺手的IDE。Editplus虽然用的熟,不过那个的效率太低而且代码看起来也很不方便,经过一个多月的试用,发现了一款好用的编...

892
来自专栏WD学习记录

牛客网 二叉树的深度

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

661

扫码关注云+社区