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近期在玩一个解密类的游戏.他们须要控制角色在一片原始丛林里面探险 ...
随机推荐
- C# TryXXXX模式
public static int? TrayParse(string text) { int ret; if (int.TryParse(text,out ret)) { return ret; } ...
- 几点基于Web日志的Webshell检测思路
http://www.open-open.com/lib/view/open1456751673359.html
- CodeIgniter API
http://apigen.juzna.cz/doc/EllisLab/CodeIgniter/tree.html Classes CI_Benchmark CI_Calendar CI_Cart C ...
- hdu 4023 Game 博弈论
思路: 将15种分成5类: 1.1和2为一类: 2.3,4,5,6为一类: 3.7,8,9,10为一类: 4.11,12,13,14,15为一类: 5.15为一类. 比较各类的优先级,就会发现放置的顺 ...
- spring_150802_resource
接口Service: package com.spring.service; public interface DogPetService { public void queryAllDogPets( ...
- 【重走Android之路】【路线篇(二)】知识点归纳
[重走Android之路][路线篇(二)]知识点归纳 参考:http://blog.csdn.net/xujing81/article/details/7313507 第一阶段:Java面向对 ...
- 运行java -version报cannot restore segment prot after reloc: Permission denied
linux 安装jdk1.6后,运行java -version,没有出现相关的版本信息,而是出现了以下错误: dl failure on line 685Error: failed /usr/loca ...
- sublime3运行lua
{ "cmd": ["/usr/local/bin/lua", "$file"], "file_regex": &quo ...
- 最短路径BellmanFord , Dijsktra
最短路径算法也是常用的图算法,在网上看到了一份c的代码,写的很清楚,今天有空给写成java的了,就当练手了.另,算法导论362页详细介绍了Bellman-Ford算法,本来打算再写个Dijsktra算 ...
- libevent系列文章
Libevent 2 提供了 bufferevent 接口,简化了编程的难度,bufferevent 实际上是对底层事件核心的封装,因此学习 bufferevent 的实现是研究 Libevent 底 ...