拓扑排序·一

分析:

此题就是求一个有向图中是否存在环。 如存在环则输出"Wrong", 若不存在环, 说明课程安排的合理,输出"Correct"。

题中的提示说的已经十分清楚了。

总的来说就是:

① 找出入度为0的点(说明该点没有前驱),把该点放入集合T中。 把所有从该点出发的边都删除;

② 遍历剩余的点, 找出入度为0 的点, 重复①操作。

③直到不存在入度为0的点。 结束。如果此时集合T中包含所有的点, 那么该图不存在环, 否则存在环。

注意:1、执行操作①时, 在删除边时(u, v),同时更新与其相关点的入度(du[v]--);

2、 在执行操作②时, 需要遍历所有点, 点少的时候可行, 点多的话很容易超时。 所以题目的提示中告诉了一个好办法就是: 执行操作①更新相关点的入度时直接判断一下是否为0, 若为零则入队列。 这样会省很多时间。

如下图例子:

开始点1入度为0, 点1加入集合T,   删除从1出发的边;  更新相关点的入度, 点2、3的入度都变为0了 , 2、3入队列;

再依次对点2、3进行①操作, 2、3加入T,   删除边(2, 4), (3, 4), 此时没有其他点入度为0了, 结束操作, T中未包含所有点, 说明该图中有环;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std; int t, n, m, sum, du[];
vector<int> vec[]; int ac()
{
queue<int> q;
for(int i = ; i <= n; i++)//遍历一边所有点, 把入度为0的点,全加入队列q中
{
if(du[i] == )
q.push(i);
}
while(!q.empty())
{
int tem = q.front();//在队列中取出一个入度为0的点
q.pop();
sum++;
//把所有从tem出发的边(tem, v)删除并更新du[],
for(int i = ; i < vec[tem].size(); i++)
{
du[vec[tem][i]]--;
if(du[vec[tem][i]] == )//若点vec[tem][i]入度更新后为0, 则入队列
q.push(vec[tem][i]);
}
vec[tem].clear();
}
if(sum == n) return ;
else
return ;
}
int main()
{
cin >> t;
while(t--)
{
scanf("%d%d", &n, &m);
//用vec[]来存边
for(int i = ; i <= n; i++) vec[i].clear();
memset(du, , sizeof(du));//初始化入度, 置为0;
for(int i = ; i <= m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
vec[x].push_back(y); // 加入边
du[y]++; //记录入度
}
sum = ;
int ans = ac();
if(ans == )
printf("Correct\n");
else
printf("Wrong\n");
}
return ;
}

拓扑排序·二

分析:

和上一道差不多, 只是多了一项就是记录每个点的病毒数。  每个点的病毒数 = 自身病毒数 +  所有能够达到它的节点病毒数之和( 就是所有它前驱点的病毒数的和)。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int mod = ;
int n, m, k, sum, virus[], du[];
vector<int> vec[]; void ac()
{
queue<int> q;
for(int i = ; i <= n; i++)
{
if(du[i] == )
q.push(i);
}
while(!q.empty())
{
int tmp = q.front(); q.pop();
sum = (sum + virus[tmp]) % mod; //把所有前驱点为 tmp 的点的病毒数都加上 tmp的病毒数
for(int i = ; i < vec[tmp].size(); i++)
{
int b = vec[tmp][i];
virus[b] = (virus[tmp] + virus[b]) % mod;// 此处也一定要取模,
du[b]--;
if(du[b] == )
q.push(b);
}
vec[tmp].clear();
}
}
int main()
{
while(scanf("%d%d%d", &n, &m, &k) != EOF)
{
memset(virus, , sizeof(virus));
memset(du, , sizeof(du));
for(int i = ; i <= n; i++) vec[i].clear(); for(int i = ; i <= k; i++)
{
int x;
scanf("%d", &x);
virus[x]++;
}
for(int i = ; i <= m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
vec[x].push_back(y);
du[y]++;
} sum = ;
ac();
printf("%d\n", sum);
}
return ;
}

hiho拓扑排序专题 ——第四十八、四十七周的更多相关文章

  1. Unity 游戏框架搭建 2019 (四十八/四十九) MonoBehaviourSimplify 中的消息策略完善&关于发送事件的简单封装

    MonoBehaviourSimplify 中的消息策略完善 在上一篇,笔者说,MonoBehaviourSimplify 中的消息策略还有一些小问题.我们在这篇试着解决一下. 先贴出来代码: usi ...

  2. NeHe OpenGL教程 第四十八课:轨迹球

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. SQL注入之Sqli-labs系列第四十七关,第四十八关,第四十九关(ORDER BY注入)

    0x1 源码区别点 将id变为字符型:$sql = "SELECT * FROM users ORDER BY '$id'"; 0x2实例测试 (1)and rand相结合的方式 ...

  4. 《手把手教你》系列技巧篇(四十八)-java+ selenium自动化测试-判断元素是否可操作(详解教程)

    1.简介 webdriver有三种判断元素状态的方法,分别是isEnabled,isSelected 和 isDisplayed,其中isSelected在前面的内容中已经简单的介绍了,isSelec ...

  5. 第四十八个知识点:TPM的目的和使用方法

    第四十八个知识点:TPM的目的和使用方法 在检查TPM目的之前,值得去尝试理解TPM设计出来的目的是为了克服什么样的问题.真正的问题是信任.信任什么?首先内存和软件运行在电脑上.这些东西能直接的通过操 ...

  6. hiho一下 第四十八周 拓扑排序·二【拓扑排序的应用 + 静态数组 + 拓扑排序算法的时间优化】

    题目1 : 拓扑排序·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当 ...

  7. [hihoCoder] 第四十八周: 拓扑排序·二

    题目1 : 拓扑排序·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当 ...

  8. abp(net core)+easyui+efcore实现仓储管理系统——入库管理之十二(四十八)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  9. SQL注入之Sqli-labs系列第四十一关(基于堆叠注入的盲注)和四十二关四十三关四十四关四十五关

    0x1普通测试方式 (1)输入and1=1和and1=2测试,返回错误,证明存在注入 (2)union select联合查询 (3)查询表名 (4)其他 payload: ,( ,( 0x2 堆叠注入 ...

随机推荐

  1. <%%>与<scriptrunat=server>,<%=%>与<%#%>的区别

      这些东西都是asp.net前台页面与后台代码交互过程中经常使用的,它们之间有的非常相似,又有一些不同.对比学习下,看看他们之间的联系与区别. 首先看<%%>与<scriptrun ...

  2. stm32上的Lava虚拟机开发进度汇报(4)

    这段时间颓废了,基本上没在弄这个东西. 主要是因为前段时间把代码基本上写完之后,但是问题一大堆,除了自己写的几个简单测试程序,其他现成的东西没有一个是能正常运行的,很是郁闷,也不知道哪里有错误,所以放 ...

  3. IOS Note - Core NS Data Types

    NSString (Immutable)NSMutableString (rarely used)NSNumberNSValueNSData (bits)NSDateNSArray (Immutabl ...

  4. Caching in ASP.NET MVC

    The caching options available in ASP.NET MVC applications don’t come from the ASP.NET MVC Framework, ...

  5. SpringMVC4.2.4 xml配置

    环境:1.基于spring4.2.4版本,也是spring当前(2016.2)最新的GA版本 2.maven 3.2.1 3.jdk1.7 xml配置1: web.xml <?xml versi ...

  6. mmc生产运输问题

    本题目结合生产和运输,增加了约束, 其实,比较生产,运输问题,大同小异, 解法基本相同.

  7. CSS3/jQuery自己定义弹出窗体

    简单演示一下,精简了演示效果和css样式文件,更利于在项目中的实际应用 引入style.css   index.js <!DOCTYPE HTML PUBLIC "-//W3C//DT ...

  8. MaterialViewPager

    https://github.com/florent37/MaterialViewPager

  9. centos6.x已经安装的系统添加图形界面

    yum groupinstall "X Window System" yum groupinstall GNOME Desktop Environment

  10. 关于php ci框架ie浏览器路径问题

    ie不能定位到这个location,而是在地址栏形成类似eg.com/index.php/class/class/class/fucntion (支持应该为eg.com/index.php/class ...