暂时没写关于拓补排序和不下降序列的专题…先把这道码量巨大的题写出来,免得忘了…

Description

xxxxxyt学姐经常一个人在家,难免会感到寂寞,于是学姐养了n只可爱的宠物,比如皮皮虾、大蟒蛇、藏狐、安康鱼…但即便如此学姐还是感到无聊。突然有一天,学姐想到
了让宠物们互相对战的消遣方法(请不要给动物保护协会打电话!)。学姐让宠物们两两进
行对战,n*(n-1)/2场对战后,学姐得到了一张相生相克图,然后又根据自己的喜好,把
宠物们分成了一队与二队。就在队伍分好后,学姐的强迫症又犯了,她希望自己的两支队伍
都满足这样一个性质:存在某种排列,使得排在后面的宠物能够击败排在前面的所有宠物。
但学姐的懒惰大家都是知道的,所以她找到了你,希望你能告诉她这两支队伍是否均满足要
求,如果是,她还希望你告诉她最多可以从二队中抽出多少只宠物放在一队,使得两支队伍
仍然满足要求。努力解决问题吧,而xxxxxyt学姐,瘫躺。

Input

第一行输入两个数字n和m,分别表示学姐有n只宠物,其中被分到一队的宠物有m
只。
接下来n行每行n个数字,ai,j
表示第i只宠物是否能战胜第j只宠物,保证ai,i=0
且ai,j=!aj,i

接下来一行m个数字,表示有哪些宠物被分到了一队。

Output

如果两支队伍均不能让xxxxxyt满意,则输出“NO”;否则输出“YES”,并输出一个
最大的k,使得从二队中非任意地抽出k只宠物放入一队后,两支队伍仍然满足条件。详细
格式见样例输出。

Sample Input 1

3 2
0 1 1
0 0 1
0 0 0
3 1

Sample Output 1

YES 1

Sample Input 2

4 3
0 1 0 1
0 0 1 1
1 0 0 1
0 0 0 0
1 2 3

Sample Output 2

NO

Sample Input 3

4 2
0 1 0 1
0 0 1 1
1 0 0 1
0 0 0 0
1 2

Sample Output 3

YES 1

Hint

注意:
宠物们的实力是相对的,也就是可能会出现A战胜B,B战胜C,C又战胜A的
情况。
数据范围:
20%的数据1<=m<n<=10
60%的数据1<=m<n<=100
100%的数据1<=m<n<=100

Solution

首先要明白,如果想要一个明确的排列顺序,不可能存在 A>B B>C C>A的,这不是一个合法的线性排列。

那么,把战胜关系转换成有向图,这种不合法的排列就是一个环的形状。

如何判环,并且如果没有环的情况下能得出一个合法的排列?

这样就不难想到用拓补排序来解决了。(然而考试的时候并没想到,用深搜判环…炸的一塌糊涂…)

因为要分成两组队列,那么就需要把这张图根据队列成员来分开。

通过bool数组实现A序列和B序列的区分,分别单独统计在自己成员内的入度,然后进行拓补排序。

因为拓补排序的删边操作会破坏原图,所以在拓补前先备份一张原图。

如果存在有节点无法拓补排序,即存在环,那么输出NO结束程序。

否则进入第二个问题。

假定A序列长度为m。我们需要知道,序列B的成员i能插入序列A的第j位置,需要满足如下条件:

Aj+1、Aj+2…Am<Bi<A1、A2、A3…Aj(这里<符号的意义是能够战胜)

并且,Bi在Ai的插入位置j必须保持不下降,即不能破坏B的原序列顺序。

那么,这题就又转换到了最长不下降子序列长度问题了。求出每个Bi的插入位置,然后将所得的序列求最长不下降子序列。这样即保证了插入数量最多,又保证了序列没有和B序列冲突。

个人认为,最长序列写法要比那个动规好理解点…

下面是巨长的代码…

#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
const int MAXSIZE = 1 << 22;
const int MAXN=1002;
inline char gc()
{static char In[MAXSIZE], *at = In, *en = In;if (at == en){en = (at = In) + fread(In, 1, MAXSIZE, stdin);}return at == en ? EOF : *at++;
}
inline long long Read()
{char c;while (c = gc(), !(c >= '0'&&c <= '9') && c != '-') {}bool f = c == '-';long long x = f ? 0 : c - '0';for (c = gc(); c >= '0'&&c <= '9'; c = gc()){x = x * 10 + c - '0';}return f ? -x : x;
}
int n,m;
int Map[MAXN][MAXN];
int ReMap[MAXN][MAXN];
bool Mark[MAXN];
int A[MAXN];
int B[MAXN];
int EdgeIn[MAXN];
int Q_A[MAXN];
int lenA;
int Q_B[MAXN];
int lenB;
int Position[MAXN];
int Lis[MAXN];
int ans;
bool Circle_Being;
void ToplogicalSort_A(){memset(Mark,0,sizeof(Mark));queue<int>q;for(int i=1;i<=m;i++){if(!EdgeIn[A[i]]){q.push(A[i]); }}while(!q.empty()){int First=q.front();q.pop();Mark[First]=true;Q_A[++lenA]=First;for(int i=1;i<=m;i++){if(ReMap[First][A[i]]){ReMap[First][A[i]]=0;EdgeIn[A[i]]--;if(!EdgeIn[A[i]]){q.push(A[i]);}}}}if(lenA<m){//cout<<"A has circle"<<endl;Circle_Being=true;return ;}
}
void ToplogicalSort_B(){memset(Mark,0,sizeof(Mark));queue<int>q;for(int i=1;i<=B[0];i++){if(!EdgeIn[B[i]]){q.push(B[i]);}}while(!q.empty()){int First=q.front();q.pop();Mark[First]=true;Q_B[++lenB]=First;for(int i=1;i<=B[0];i++){if(ReMap[First][B[i]]){ReMap[First][B[i]]=0;EdgeIn[B[i]]--;if(!EdgeIn[B[i]]){q.push(B[i]);}}}}if(lenB<B[0]){//cout<<"B has circle"<<endl;Circle_Being=true;}
}
int main(){n=Read();m=Read();for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){Map[i][j]=Read();ReMap[i][j]=Map[i][j];}}for(int i=1;i<=m;i++){A[i]=Read();Mark[A[i]]=true;}for(int i=1;i<=m;i++){for(int j=1;j<=m;j++){if(Map[A[i]][A[j]]){EdgeIn[A[j]]++;}}}for(int i=1;i<=n;i++){if(!Mark[i]){B[++B[0]]=i;}}for(int i=1;i<=B[0];i++){for(int j=1;j<=B[0];j++){if(Map[B[i]][B[j]]){EdgeIn[B[j]]++;}}}ToplogicalSort_A();ToplogicalSort_B();if(Circle_Being){printf("NO");return 0;}printf("YES ");//截止这里,就已经实现了用拓补排序判断是否存在环的情况。for(int j=1;j<=B[0];j++){Lis[j]=1;int i=1;while(Map[Q_A[i]][Q_B[j]]&&i<=m){i++;}Position[j]=i;bool Insert=false;for(int k=i;k<=m;k++){if(Map[Q_A[k]][Q_B[j]]){Insert=true;break;}}if(Insert){Position[j]=0;}}for(int i=1;i<=B[0];i++){if(!Position[i]){continue;}for(int j=1;j<i;j++){if(Position[j]<=Position[i]&&Position[j]){Lis[i]=max(Lis[i],Lis[j]+1);}}}for(int i=1;i<=B[0];i++){ans=max(ans,Lis[i]);}printf("%d",ans);
} 

转载于:https://www.cnblogs.com/Uninstalllingyi/p/11525189.html

NKOI3747 Pets宠物相关推荐

  1. 2021年中国宠物玩具与训练市场趋势报告、技术动态创新及2027年市场预测

    宠物玩具与训练市场的企业竞争态势 该报告涉及的主要国际市场参与者有Kong.chuck it.Jolly pets.Nylabone.Petmate.JW pet.Coastal pets.Floss ...

  2. 宠物保存服务市场现状及未来发展趋势分析

    2022-2028年全球与中国宠物保存服务市场现状及未来发展趋势分析报告 报告编号:1648867 免费目录下载:http://www.cninfo360.com/yjbg/quanqiujizhon ...

  3. 2021-2027全球与中国宠物托管市场现状及未来发展趋势

    本文研究全球及中国市场宠物托管现状及未来发展趋势,侧重分析全球及中国市场的主要企业,同时对比北美.欧洲.中国.日本.东南亚.印度等地区的现状及未来发展趋势. 2020年全球宠物托管市场规模达到了 亿元 ...

  4. 2021-2027全球与中国宠物寄养市场现状及未来发展趋势

    本文研究全球及中国市场宠物寄养现状及未来发展趋势,侧重分析全球及中国市场的主要企业,同时对比北美.欧洲.中国.日本.东南亚.印度等地区的现状及未来发展趋势. 2020年全球宠物寄养市场规模达到了 亿元 ...

  5. 宠物商店管理系统(java)

    目录 一.实验目的 二.实验环境 三.实验内容与要求 (一) 问题描述 (二) 实验要求 四.实现提示 五.代码 1.Pets(宠物类) 2.Dog(狗类) 3.Cat(猫类) 4.PetStore( ...

  6. 2016版单词的减法_在2016年最大的电影中,女性只说了27%的单词。

    2016版单词的减法 by Amber Thomas 通过琥珀托马斯 在2016年最大的电影中,女性只说了27%的单词. (Women only said 27% of the words in 20 ...

  7. 如何正确汉化/选择模拟人生2 (SIMS2)以及其资料片的语言

    网络上的方法: 1.首先要先打开电脑的注册表: 打开注册表的方法:"开始"-"运行"-输入regedit-"确定",即可调出注册表. 2.在 ...

  8. EF CORE 7 中的新功能:使用 ExecuteDelete 和 ExecuteUpdate 进行批量操作

    原文链接:https://timdeschryver.dev/blog/new-in-entity-framework-7-bulk-operations-with-executedelete-and ...

  9. 云计算科普:Pets(宠物)和Cattle(牲口)傻傻分不清楚?

    在云上,有两个概念:Pets和Cattle,它们很形象地比喻了服务器的两种管理模式. Pets,宠物,比方说猫猫狗狗.如果我们拥有一只猫,我们会关注它这个个体,会跟它起可爱.独特的名字,它需要我们持续 ...

最新文章

  1. Linux 下ntpdate网络校时使用
  2. Zabbix 企业级监控_
  3. 手机应用开发的方式不能完全套用到iPad上
  4. 高效利用无标注数据:自监督学习简述
  5. IDEA(Pycharm)一家子常用快捷键Keymap对应的英文、中文与具体位置
  6. git如何查看和切换账号
  7. #上位机开发大师之路# 管理员登陆模块开发
  8. IDEA java 运行程序 指定运行参数
  9. python isnumberic用法_NETASST技术博客
  10. 车站订票系统可行性分析报告
  11. 解析12306订票流程
  12. 磊科路由器信号按键_怎样隐藏磊科路由器WiFi信号
  13. Scratch案例——画彩虹
  14. 杀戮尖塔用java也打不开_游戏进不去 打不开 求救
  15. 解决Photoshop CS3 输入中文不能显示 输入文字不能显示 输入文字显示缓慢
  16. QT延时函数sleep
  17. 阿里云数据库再获学术顶会认可,一文全览VLDB最新亮点
  18. easyexcel结合zip 导出压缩文件(包含多个excel)
  19. 访问ip不在白名单中,请参考FAQ:
  20. Python实现一个全国各高校查询系统

热门文章

  1. access窗体中再制作查询窗体_Excel订单管理系统,窗体录入查询,快捷汇总统算,一键不加班...
  2. 关于可变参数函数+ _INTSIZEOF宏实现详细
  3. ubuntu学习篇2——虚拟机网络配置
  4. 【正点原子FPGA连载】 第三十章双目OV5640摄像头LCD显示实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南
  5. 六石编程学:比垃圾软件更差更可怕的致命软件、剧毒软件
  6. 互联网打工人的副业与B面生活
  7. java顺风车匹配_嘀嗒顺风车以“信息匹配六步走”的模式保障“真顺风”
  8. Bootstrap 组件 Breadcrumb(面包屑)
  9. Bootstrap—面包屑导航breadcrumb
  10. 2013年02月24日 元宵夜晚