团体程序设计天梯赛-练习集L2篇⑦

简介: 团体程序设计天梯赛-练习集L2篇⑦

70cc977fd4e242d1b2ded47c6c3938da.png

下面是PTA的OJ平台

PTA的OJ平台(点击我直跳)

题解

L2-023 图着色问题

图着色问题是一个著名的NP完全问题。给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?


但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解。


输入格式:

输入在第一行给出3个整数V(0<V≤500)、E(≥0)和K(0<K≤V),分别是无向图的顶点数、边数、以及颜色数。顶点和颜色都从1到V编号。随后E行,每行给出一条边的两个端点的编号。在图的信息给出之后,给出了一个正整数N(≤20),是待检查的颜色分配方案的个数。随后N行,每行顺次给出V个顶点的颜色(第i个数字表示第i个顶点的颜色),数字间以空格分隔。题目保证给定的无向图是合法的(即不存在自回路和重边)。


输出格式:

对每种颜色分配方案,如果是图着色问题的一个解则输出Yes,否则输出No,每句占一行。


输入样例:

6 8 3

2 1

1 3

4 6

2 5

2 4

5 4

5 6

3 6

4

1 2 3 3 1 2

4 5 6 6 4 5

1 2 3 4 5 6

2 3 4 2 3 4

输出样例:

Yes

Yes

No

No


AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e8+10;
struct node{
  int u,v;
}p[N];
int main()
{
  int v,e,k;
  cin>>v>>e>>k;
  int a[501];
  set<int>st;
  for(int i=0;i<e;i++)
    cin>>p[i].u>>p[i].v;
  int q;
  cin>>q;
  while(q--)
  {
    for(int i=1;i<=v;i++)
    {
      cin>>a[i];
      st.insert(a[i]);
    }
    if(st.size()!=k)
    {
      cout<<"No"<<endl;
            st.clear();
      continue;
    }
    int flag=0;
    for(int i=0;i<e;i++)
    {
      if(a[p[i].u]==a[p[i].v])
      {
        flag=1;
        break;
      }
    }
    if(flag)
      cout<<"No"<<endl;
    else
      cout<<"Yes"<<endl;
    st.clear();
  }
}

L2-024 部落

在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属于同一个部落。


输入格式:

输入在第一行给出一个正整数N(≤10

4

),是已知小圈子的个数。随后N行,每行按下列格式给出一个小圈子里的人:


K P[1] P[2] ⋯ P[K]


其中K是小圈子里的人数,P[i](i=1,⋯,K)是小圈子里每个人的编号。这里所有人的编号从1开始连续编号,最大编号不会超过10

4


之后一行给出一个非负整数Q(≤10

4

),是查询次数。随后Q行,每行给出一对被查询的人的编号。


输出格式:

首先在一行中输出这个社区的总人数、以及互不相交的部落的个数。随后对每一次查询,如果他们属于同一个部落,则在一行中输出Y,否则输出N。


输入样例:

4

3 10 1 2

2 3 4

4 1 5 7 8

3 9 6 4

2

10 5

3 7

输出样例:

10 2

Y

N


AC代码:

#include<bits/stdc++.h>
using namespace std;
int fa[10005];
int find(int i)
{
  if(fa[i]==i)
    return i;
  else
  {
    fa[i]=find(fa[i]);
    return fa[i];
  }
}
int unio(int i,int j)
{
  int x=find(i);
  int y=find(j);
  fa[x]=y;
}
int main()
{
  int n;
  cin>>n;
  for(int i=1;i<=10005;i++)
    fa[i]=i;
  set<int>st;
  for(int i=1;i<=n;i++)
  {
    int k,x,x1;
    cin>>k;
    cin>>x;
    st.insert(x);
    for(int j=1;j<k;j++)
    {
      cin>>x1;
      st.insert(x1);
      unio(x,x1);
    }
  }
  int ans=0;
  for(int i=1;i<=st.size();i++)
  {
    if(fa[i]==i)
      ans++;
  }
  cout<<st.size()<<" "<<ans<<endl;
  int m;
  cin>>m;
  for(int i=1;i<=m;i++)
  {
    int a,b;
    cin>>a>>b;
    if(find(a)==find(b))
      cout<<"Y"<<endl;
    else
      cout<<"N"<<endl;
  }
}

L2-025 分而治之

分而治之,各个击破是兵家常用的策略之一。在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破。为此参谋部提供了若干打击方案。本题就请你编写程序,判断每个方案的可行性。


输入格式:

输入在第一行给出两个正整数 N 和 M(均不超过10 000),分别为敌方城市个数(于是默认城市从 1 到 N 编号)和连接两城市的通路条数。随后 M 行,每行给出一条通路所连接的两个城市的编号,其间以一个空格分隔。在城市信息之后给出参谋部的系列方案,即一个正整数 K (≤ 100)和随后的 K 行方案,每行按以下格式给出:


Np v[1] v[2] … v[Np]

其中 Np 是该方案中计划攻下的城市数量,后面的系列 v[i] 是计划攻下的城市编号。


输出格式:

对每一套方案,如果可行就输出YES,否则输出NO。


输入样例:

10 11

8 7

6 8

4 5

8 4

8 1

1 2

1 4

9 8

9 1

1 10

2 4

5

4 10 3 8 4

6 6 1 7 5 4 9

3 1 8 4

2 2 8

7 9 8 7 6 5 4 2

输出样例:

NO

YES

YES

NO

NO


AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,a,b,k,dt[10010];
vector<int>v[10010];
bool isleagle(int n)
{
  for(int i=1;i<=n;i++)
  {
    for(int j=0;j<v[i].size();j++)
    {
      if(dt[i]==0&&dt[v[i][j]]==0)
        return false;
    } 
  }
  return true;
}
int main()
{
  scanf("%d %d",&n,&m);
  for(int i=1;i<=m;i++)
  {
    scanf("%d%d",&a,&b);
    v[a].push_back(b);
    v[b].push_back(a);
  }
  int t;
  scanf("%d",&t);
  for(int i=0;i<t;i++)
  {
    memset(dt,0,sizeof(dt));
    scanf("%d",&k);
    for(int j=0;j<k;j++)
    {
      scanf("%d",&a);
      dt[a]=1;
    }
    if(isleagle(n)==true)
      printf("YES\n");
    else
      printf("NO\n");
  }
}

L2-026 小字辈

本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。


输入格式:

输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。


输出格式:

首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。


输入样例:

9

2 6 5 5 -1 5 6 4 7

输出样例:

4

1 9


AC代码:

#include<bits/stdc++.h>
using namespace std;
int f[100001]={-1};
int h[100001];
int find(int x)
{
  if(f[x]==-1) 
    h[x]=1;
  else if(h[x]==0)
    h[x]=find(f[x])+1;
  return h[x];
}
int main()
{
  int n;
  cin>>n;
  for(int i=1;i<=n;i++)
    cin>>f[i];
  for(int i=1;i<=n;i++)
    find(i);
  int maxn=0;
  for(int i=1;i<=n;i++)
  {
    if(h[i]>maxn)
      maxn=h[i];
  }
  cout<<maxn<<endl;
  bool flag=true;
  for(int i=1;i<=n;i++)
  {
    if(h[i]==maxn)
    {
      if(flag)
      {
        flag=false;
        cout<<i;
      }
      else
        cout<<" "<<i;
    }
  }
}

4

写在最后

🍉🍉🍉不必偏执于未知的真实,身处的当下即是意义和真实,爱才是解题的答案,也是刻画人生色彩的笔尖,耐心的走下去,总会遇到你爱的人和爱你的人。


🍁🍁🍁好啦,本文的内容就到此结束啦,我们下期再见哦!另外在祝各位小伙伴们要天天开心哦!

🍂🍂🍂如果你觉得本文对你有帮助的话,还请不要吝惜您的三连哦!您的支持就是我创作的最大动力!!爱你们💕💕💕

相关文章
团体程序设计天梯赛-练习集L2篇⑨
团体程序设计天梯赛-练习集L2篇⑨
169 0
|
测试技术
团体程序设计天梯赛-练习集L2篇⑥
团体程序设计天梯赛-练习集L2篇⑥
118 0
|
Perl
团体程序设计天梯赛-练习集L1篇③
团体程序设计天梯赛-练习集L1篇③
140 0
7-5 重要的话说三遍 —— 团体程序设计赛
这道超级简单的题目没有任何输入。
103 0
7-5 重要的话说三遍 —— 团体程序设计赛
|
算法 安全 定位技术
团体程序设计天梯赛(上)
团体程序设计天梯赛
450 0
团体程序设计天梯赛(上)
|
存储 大数据
团体程序设计天梯赛(下)
团体程序设计天梯赛(下)
402 0
团体程序设计天梯赛(下)
|
人工智能
【CCCC】PAT : 团体程序设计天梯赛-练习集 L1 答案
【CCCC】PAT : 团体程序设计天梯赛-练习集 L1 答案
399 0
【CCCC】PAT : 团体程序设计天梯赛-练习集 L3 答案(01-23)
【CCCC】PAT : 团体程序设计天梯赛-练习集 L3 答案(01-23)
128 0
PTA团体程序设计天梯赛-练习集 L2 网红点打卡攻略(模拟)
PTA团体程序设计天梯赛-练习集 L2 网红点打卡攻略(模拟)
182 0
团体程序设计天梯赛-练习集 - L3-011 直捣黄龙(30 分)
团体程序设计天梯赛-练习集 - L3-011 直捣黄龙(30 分)
128 0

相关实验场景

更多