hihoCoder hiho一下 第四十八周 题目1 : 拓扑排序·二
题意:
给定一个拓扑图,其中部分结点含有1个病毒,每个结点只要收到病毒就会立即往出边所能到达的点传播,病毒数可叠加,求所有结点的病毒数总和。
思路:
根据拓扑的特点,每个入度为0的点肯定不会再被传播病毒,而且会将自己的所有病毒向与其相连的结点传播。那么可以从入度味为0的点着手,逐个删除入度为0的结点,在删除的过程中,更新与其相连的结点的病毒数(即将病毒数累加到该结点),到最后所有结点都没了,各个结点所累积的病毒数的和就是答案。
#include<bits/stdc++.h>
using namespace std;
const int N=;
const int mod=; bool init[N]; //初始是否有病毒
int cnt[N]; //各点的入度
vector< vector<int> > vect; //邻接表
int ans[N]; //各个节点的病毒数,不包括其自身初始的那个病毒 int cal(int n, int k)
{
vector<int> a;
for(int i=; i<=n; i++) if(!cnt[i]) a.push_back(i); //先装进去初始时入度为0的点 vector<int> b;
while(!a.empty())
{
b.clear();
for(int i=; i<a.size(); i++) //对于每个入度为0的点,更新与其相连的每个点的病毒数
{
for(int j=; j<vect[a[i]].size(); j++)
{
int tmp=vect[a[i]][j];
cnt[tmp]--; //入度减少1
ans[tmp]=(ans[tmp]+ans[a[i]]+init[a[i]])%mod; //更新病毒数,包括初始那个病毒
if(!cnt[tmp]) b.push_back(tmp); //又一个入度为0的
}
}
a.clear();
if(!b.empty())
a.insert(a.end(), b.begin(), b.end());
}
int sum=;
for(int i=; i<=n; i++) //统计
sum=(sum+ans[i])%mod;
sum+=k; //还有初始的病毒
return sum%mod;
} int main()
{
//freopen("e://input.txt","r",stdin);
int k, n, m, a, b;
cin>>n>>m>>k;
vector<int> tmp;
for(int i=; i<=n; i++) vect.push_back(tmp); //初始化 for(int i=; i<k; i++) //k个病毒
{
scanf("%d",&a);
init[a]=true;
}
for(int i=; i<m; i++) //m个边
{
scanf("%d%d",&a,&b);
vect[a].push_back(b);
cnt[b]++; //入度数
}
printf("%d\n",cal(n,k));
return ;
}
AC代码
hihoCoder hiho一下 第四十八周 题目1 : 拓扑排序·二的更多相关文章
- hiho一下 第四十八周 拓扑排序·二【拓扑排序的应用 + 静态数组 + 拓扑排序算法的时间优化】
题目1 : 拓扑排序·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当 ...
- hihoCoder hiho一下 第四十六周 博弈游戏·Nim游戏·三( sg函数 )
题意: 给出几堆石子数量,每次可以取走一堆中任意数量的石头,也可以将一堆分成两堆,而不取.最后取走者胜. 思路: 先规矩地计算出sg值,再对每个数量查SG值就可以了.最后求异或和.和不为0的就是必赢. ...
- hiho一下 第四十九周 题目1 : 欧拉路·一【无向图 欧拉路问题】
题目1 : 欧拉路·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最 ...
- hiho一下 第四十五周 博弈游戏·Nim游戏·二(转成NIm)
Alice和Bob这一次准备玩一个关于硬币的游戏:N枚硬币排成一列,有的正面朝上,有的背面朝上,从左到右依次编号为1..N.现在两人轮流翻硬币,每次只能将一枚正面朝上的硬币翻过来,并且可以随自己的意愿 ...
- hiho一下 第四十五周 博弈游戏·Nim游戏·二 [ 博弈 ]
传送门 题目1 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和Bob这一次准备玩一个关于硬币的游戏:N枚硬币排成一列,有的正面 ...
- [hihoCoder] 第四十八周: 拓扑排序·二
题目1 : 拓扑排序·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当 ...
- hiho一下 第三十八周 二分答案
题目链接:http://hihocoder.com/contest/hiho38/problem/1 ,挺难想的解题思路,好题. 按照提示的算法来: 我们需要找什么? 在这个题目中我们需要找的是路径最 ...
- hiho一下 第四十九周 欧拉路
http://hihocoder.com/contest/hiho49/problem/1 给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,该条路称为欧拉路. 一个无向图存在欧拉路当且仅当 ...
- hiho一下 第四十九周 欧拉路·一
[题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小Hi和小Ho近期在玩一个解密类的游戏.他们须要控制角色在一片原始丛林里面探险 ...
随机推荐
- HDU 1403 Longest Common Substring(后缀数组,最长公共子串)
hdu题目 poj题目 参考了 罗穗骞的论文<后缀数组——处理字符串的有力工具> 题意:求两个序列的最长公共子串 思路:后缀数组经典题目之一(模版题) //后缀数组sa:将s的n个后缀从小 ...
- Shell练习 行列转换
原题:https://leetcode.com/problems/transpose-file/Given a text file file.txt, transpose its content. Y ...
- 欧拉工程第54题:Poker hands
package projecteuler51to60; import java.awt.peer.SystemTrayPeer; import java.io.BufferedReader; impo ...
- Eclipse项目的导入跟导出
1.导入项目 当下载了包含Eclipse 项目的源代码文件后,我们可以把它导入到当前的Eclipse 工作区然后编辑和查看.点击菜单File > Import,然后在弹出的Import 对话框中 ...
- Ajax实例-购物车
一.概述 1.当添加或删除商品时,购物车会立即更新数据 2.思路: (1)建立商品类Item.java,存有商品属性name,prince,code(商品编码)等 (2)建立商品目录类Catalog. ...
- Redis的String操作
set key value [ex 秒数] / [px 毫秒数] [nx] /[xx] 如: set a 1 ex 10 , 10秒有效 Set a 1 px 9000 , 9秒有效 注: 如果ex, ...
- 管理IPv4网络连接
1. 使用 nmcli 检查所有连接 [root@desktop1 ~]# nmcli connection NAME UUID TYPE DEVICE eno33554960 5be7dba9-6b ...
- IE内存泄露与无法回收研究小结
一.内存泄露 之前确实看了很多资料,但这位大哥的话可谓画龙点睛,不是奉承他,一下子就打通了我的任督二脉,请看: trarck 写道 IE下的内存泄露原因就是循环引用,IE的垃圾回收器不能很 ...
- HtmlHelper
HtmlHelper类 public class HtmlHelper<TModel> : HtmlHelper类 因为HtmlHelper<TModel>继承自HtmlHel ...
- Oracle ->> TRUNC, ROUND, CEIL, FLOOR
), ), CEIL(10.01), FLOOR(10.9999) FROM dual; 结果: TRUNC是直接截断小数位 ROUND是四舍五入 CEIL和FLOOR则是和SQL SERVER一样返 ...