[CSP-S模拟测试]:循环依赖(拓扑)
题目传送门(内部题148)
输入格式
每个测试点第一行为一个正整数$T$,表示该测试点内的数据组数。
接下来$T$组数据,每组数据第一行一个正整数$n$,表示有引用单元格进行计算的单元格数,接下来$n$行,每行第一个字符串为该单元格编号,接下来若干个字符串表示该单元格引用的单元格编号。
输出格式
对于每一组测试数据,若有循环依赖,则输出$Yes$,否则输出$No$。
样例
样例输入:
3
1
AA13 AA13
3
B1 A1 A2
C1 B1 A1
A2 C1 A1
4
B1 A1
C1 B1 A1
D1 C1 B1 A1
E1 D1 C1 B1 A1
样例输出:
Yes
Yes
No
数据范围与提示
样例解释:
第一组数据中,$AA13$单元格引用自身,构成了自循环依赖。
第二组数据描述了题面中的例子。
第三组数据中,$B1$引用了$A1$,$C1$引用了$B1$和$A1$,以此类推到$E1$,每一个单元格只会引用在该单元格之前列的单元格的值,因此不会构成循环依赖。
数据范围:
对于$20\%$的数据,有$1\leqslant n\leqslant 10$。
对于$50\%$的数据,有$1\leqslant n\leqslant 100$。
对于另外$30\%$的数据,每个单元格至多引用一个单元格。
对于$100\%$的数据,有$1\leqslant n\leqslant 30,000$,单元格编号为长度不超过$10$的字符串,每个单元格都引用不超过$10$个单元格(计重数,下同),每组数据中单元格编号的数量$\leqslant 90,000$,每个测试点中单元格编号的总数量不超过$450,000$,在任意一组数据中,每行第一个单元格编号不重复,但每个单元格所引用的单元格编号可能重复。
题解
玄学读入,离散化,建图,拓扑,一遍过样例!

一脸懵逼……
发现旁边同学也都是这样额。
其实
$\rightarrow$
$=$
出题人居然用$Windows$造数据!!!
换行附在$NOILinux$下是\n而在$Windows$下是\r。
剩下的就很裸了,不过如果你想用$tarjan$判环我也不拦你。
时间复杂度:$\Theta(m)$($m$表示依赖关系数)。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
unordered_map<unsigned long long,int>mp;
struct rec{int nxt,to;}e[200001];
int head[100001],cnt;
int n;
char ch[20];
int top,tot;
int du[100001];
queue<int> q;
unsigned long long hsh[500001];
unsigned long long hd[100001];
vector<unsigned long long>son[100001];
void pre_work()
{
mp.clear();cnt=top=tot=0;
memset(head,0,sizeof(head));
memset(son,0,sizeof(son));
memset(du,0,sizeof(du));
}
unsigned long long get()
{
int len=strlen(ch+1);unsigned long long res=0;
for(int i=1;i<=len;i++)res=res*131+ch[i]-'0';
return res;
}
void add(int x,int y)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
head[x]=cnt;
}
bool topsort()
{
int res=0;
for(int i=1;i<=tot;i++)if(!du[i]){q.push(i);res++;}
while(q.size())
{
int x=q.front();q.pop();
for(int i=head[x];i;i=e[i].nxt)
{
du[e[i].to]--;
if(!du[e[i].to]){res++;q.push(e[i].to);}
}
}
return res==tot;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
pre_work();
for(int i=1;i<=n;i++)
{
scanf("%s",ch+1);
hd[i]=get();
hsh[++top]=hd[i];
char c=getchar();
while(c!='\r')
{
scanf("%s",ch+1);
hsh[++top]=get();
son[i].push_back(hsh[top]);
c=getchar();
}
}
sort(hsh+1,hsh+top+1);
for(int i=1;i<=top;i++)if(hsh[i]!=hsh[i-1])mp[hsh[i]]=++tot;
for(int i=1;i<=n;i++)
{
hd[i]=mp[hd[i]];
for(int j=0;j<son[i].size();j++)
son[i][j]=mp[son[i][j]];
}
for(int i=1;i<=n;i++)
for(int j=0;j<son[i].size();j++)
{add(son[i][j],hd[i]);du[hd[i]]++;}
puts(topsort()?"No":"Yes");
}
return 0;
}
rp++
[CSP-S模拟测试]:循环依赖(拓扑)的更多相关文章
- 3.1 spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖
本次博客的目标 1. 手写spring循环依赖的整个过程 2. spring怎么解决循环依赖 3. 为什么要二级缓存和三级缓存 4. spring有没有解决构造函数的循环依赖 5. spring有没有 ...
- Spring的循环依赖
本文简要介绍了循环依赖以及Spring解决循环依赖的过程 一.定义 循环依赖是指对象之间的循环依赖,即2个或以上的对象互相持有对方,最终形成闭环.这里的对象特指单例对象. 二.表现形式 对象之间的循环 ...
- 面试必杀技,讲一讲Spring中的循环依赖
本系列文章: 听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configu ...
- 3.2spring源码系列----循环依赖源码分析
首先,我们在3.1 spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖 中手写了循环依赖的实现. 这个实现就是模拟的spring的循环依赖. 目的是为了更容易理解spring源码 ...
- 3.3 Spring5源码---循环依赖过程中spring读取不完整bean的最终解决方案
根据之前解析的循环依赖的源码, 分析了一级缓存,二级缓存,三级缓存的作用以及如何解决循环依赖的. 然而在多线程的情况下, Spring在创建bean的过程中, 可能会读取到不完整的bean. 下面, ...
- 3.4 spring5源码系列--循环依赖的设计思想
前面已经写了关于三篇循环依赖的文章, 这是一个总结篇 第一篇: 3.1 spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖 第二篇: 3.2spring源码系列----循环依赖源 ...
- 面试阿里,腾讯,字节跳动90%都会被问到的Spring中的循环依赖
前言 Spring中的循环依赖一直是Spring中一个很重要的话题,一方面是因为源码中为了解决循环依赖做了很多处理,另外一方面是因为面试的时候,如果问到Spring中比较高阶的问题,那么循环依赖必定逃 ...
- 从一部电影史上的趣事了解 Spring 中的循环依赖问题
title: 从一部电影史上的趣事了解 Spring 中的循环依赖问题 date: 2021-03-10 updated: 2021-03-10 categories: Spring tags: Sp ...
- BFS (1)算法模板 看是否需要分层 (2)拓扑排序——检测编译时的循环依赖 制定有依赖关系的任务的执行顺序 djkstra无非是将bfs模板中的deque修改为heapq
BFS模板,记住这5个: (1)针对树的BFS 1.1 无需分层遍历 from collections import deque def levelOrderTree(root): if not ro ...
随机推荐
- 【原创】大数据基础之Logstash(6)mongo input
logstash input插件之mongodb是第三方的,配置如下: input { mongodb { uri => 'mongodb://mongo_server:27017/db' pl ...
- js循环遍历性能
定length for循环 (有length) 不定length for循环(使用数组length) 不定length for循环(判断数组length是否存在) forEach(Array自带,对某 ...
- [转载]java的传值和传引用
本文转载自:https://blog.csdn.net/weixin_36759405/article/details/82764339 基本类型(byte,short,int,long,double ...
- warning LNK4076: 无效的增量状态文件“../×××.ilk”;正在非增量链接
VS编译警告:warning LNK4076: 无效的增量状态文件“../×××.ilk”;正在非增量链接 解决方法:删除程序提示的输出目录的×××.ilk,重新编译,即可
- element-ui 表单自定义日期输入校验
methods: { validateDate(rule, value, callback){ if (value) { let timestamp = new Date(value).getTime ...
- Kivy 简单尝试
Kivy 简明教程 首先,有两个网址你不得不看: Kivy: Cross-platform Python Framework for NUI在官网逛逛,顺便看看最下面的代码,try to run it ...
- 基于UDS的BootLoader
bootloader程序架构略有简化的bootloader图 这张图和恒润教程中的BootLoader流程大体是一致的. 疑问点 Q:图中的烧写顺序是34-36-34-36-34-36-37,但另一些 ...
- linux 重定向类型 超级块 i节点
超级块:定义文件系统的元数据(总大小.块大小.空闲.......):在格式化的时候确定 查看超级块信息:tune2fs -l 目录 i节点:定义文件的元数据(名称.大小.存放位置.权限.修改时间 ...
- xenserver 下载模板
cd /tmp rm -rf Auto.sh wget http://os.xensystem.net/XenSystem/download/Customer/Auto.sh sh Auto.sh
- Django学习系列19:完成最简单可用的网站——确保功能之间相互隔离
前面遗留的问题,首先时功能测试运行结束后的清理:其次是目前我们的待办清单只允许创建一个大家公用的清单. 如何隔离测试,运行功能测试后待办事项一直存在于数据库中,这会影响下一次测试. 运行单元测试时,D ...