hihoCoder hiho一下 第四十八周 题目1 : 拓扑排序·二

题意:给定一个拓扑图,其中部分结点含有1个病毒,每个结点只要收到病毒就会立即往出边所能到达的点传播,病毒数可叠加,求所有结点的病毒数总和。

思路:根据拓扑的特点,每个入度为0的点肯定不会再被传播病毒,而且会将自己的所有病毒向与其相连的结点传播。那么可以从入度味为0的点着手,逐个删除入度为0的结点,在删除的过程中,更新与其相连的结点的病毒数(即将病毒数累加到该结点),到最后所有结点都没了,各个结点所累积的病毒数的和就是答案。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=100100;
 4 const int mod=142857;
 5
 6 bool init[N];   //初始是否有病毒
 7 int cnt[N];     //各点的入度
 8 vector< vector<int> >   vect;   //邻接表
 9 int ans[N]; //各个节点的病毒数,不包括其自身初始的那个病毒
10
11
12 int cal(int n, int k)
13 {
14     vector<int> a;
15     for(int i=1; i<=n; i++)    if(!cnt[i]) a.push_back(i);  //先装进去初始时入度为0的点
16
17     vector<int> b;
18     while(!a.empty())
19     {
20         b.clear();
21         for(int i=0; i<a.size(); i++)   //对于每个入度为0的点,更新与其相连的每个点的病毒数
22         {
23             for(int j=0; j<vect[a[i]].size(); j++)
24             {
25                 int tmp=vect[a[i]][j];
26                 cnt[tmp]--; //入度减少1
27                 ans[tmp]=(ans[tmp]+ans[a[i]]+init[a[i]])%mod;   //更新病毒数,包括初始那个病毒
28                 if(!cnt[tmp])    b.push_back(tmp);  //又一个入度为0的
29             }
30         }
31         a.clear();
32         if(!b.empty())
33             a.insert(a.end(), b.begin(), b.end());
34     }
35     int sum=0;
36     for(int i=1; i<=n; i++) //统计
37         sum=(sum+ans[i])%mod;
38     sum+=k; //还有初始的病毒
39     return sum%mod;
40 }
41
42
43 int main()
44 {
45     //freopen("e://input.txt","r",stdin);
46     int k, n, m, a, b;
47     cin>>n>>m>>k;
48     vector<int> tmp;
49     for(int i=0; i<=n; i++)    vect.push_back(tmp); //初始化
50
51     for(int i=0; i<k; i++)  //k个病毒
52     {
53         scanf("%d",&a);
54         init[a]=true;
55     }
56     for(int i=0; i<m; i++)  //m个边
57     {
58         scanf("%d%d",&a,&b);
59         vect[a].push_back(b);
60         cnt[b]++;   //入度数
61     }
62     printf("%d\n",cal(n,k));
63     return 0;
64 }

AC代码

时间: 2024-08-08 09:42:21

hihoCoder hiho一下 第四十八周 题目1 : 拓扑排序·二的相关文章

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

题目1 : 拓扑排序·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当然小Hi和小Ho也参与到了其中.从大家各自了解的情况中,小Hi和小Ho整理得到了以下的信息: 校园网主干是由N个节点(编号1..N)组成,这些节点之间有一些单向的网路连接.若存在一条网路连接(u,v)链接了节点u和节点v,则节点u可以向节点v发送信息,但是节点v不能通过该链接向节点u发送信息. 在刚

hihoCoder hiho一下 第四十六周 博弈游戏&#183;Nim游戏&#183;三( sg函数 )

题意:给出几堆石子数量,每次可以取走一堆中任意数量的石头,也可以将一堆分成两堆,而不取.最后取走者胜. 思路:先规矩地计算出sg值,再对每个数量查SG值就可以了.最后求异或和. 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=105, limit=20004; 4 int a[N],n,sg[limit]={0,1,2}; 5 bool B[limit]; 6 int main() 7 { 8 //freopen(

hiho一下 第四十九周 题目1 : 欧拉路&#183;一【无向图 欧拉路问题】

题目1 : 欧拉路·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏.现在他们控制的角色来到了一个很大的湖边.湖上有N个小岛(编号1..N),以及连接小岛的M座木桥.每座木桥上各有一个宝箱,里面似乎装着什么道具. 湖边还有一个船夫,船夫告诉主角.他可以载着主角到任意一个岛上,并且可以从任意一个岛上再载着主角回到湖边,但是主角只有一次来回的机会.同时船夫告诉主

hiho一下 第四十五周 博弈游戏&#183;Nim游戏&#183;二 [ 博弈 ]

传送门 题目1 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和Bob这一次准备玩一个关于硬币的游戏:N枚硬币排成一列,有的正面朝上,有的背面朝上,从左到右依次编号为1..N.现在两人轮流翻硬币,每次只能将一枚正面朝上的硬币翻过来,并且可以随自己的意愿,在一枚硬币翻转后决定要不要将该硬币左边的任意一枚硬币也翻一次(正面翻到背面或背面翻到正面).翻最后一枚正面向上的硬币的人获胜.同样的,这次游戏里面Alice仍然先手,两人均采

hiho一下 第四十五周 博弈游戏&#183;Nim游戏&#183;二(转成NIm)

Alice和Bob这一次准备玩一个关于硬币的游戏:N枚硬币排成一列,有的正面朝上,有的背面朝上,从左到右依次编号为1..N.现在两人轮流翻硬币,每次只能将一枚正面朝上的硬币翻过来,并且可以随自己的意愿,在一枚硬币翻转后决定要不要将该硬币左边的任意一枚硬币也翻一次(正面翻到背面或背面翻到正面).翻最后一枚正面向上的硬币的人获胜.同样的,这次游戏里面Alice仍然先手,两人均采取最优的策略,对于给定的初始局面,Alice会获胜还是Bob会获胜? 题意:要使得所有硬币背面向上.每次只能反转一个正面向上

hiho一下 第四十九周(欧拉路的判定)49

/////////////////////////////////////////////////////////////////////////////////////////////////////// 作者:tt267 声明:本文遵循以下协议自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 转载请注明:http://blog.csdn.net/tt2767/article/details/45420067 ///////////////////

hiho一下 第五十八周 Beautiful String dp

题目1 : Beautiful String 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 We say a string is beautiful if it has the equal amount of 3 or more continuous letters (in increasing order.) Here are some example of valid beautiful strings: "abc", "cde"

hiho一下 第四十九周 欧拉路&#183;一

[题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏.现在他们控制的角色来到了一个很大的湖边.湖上有N个小岛(编号1..N),以及连接小岛的M座木桥.每座木桥上各有一个宝箱,里面似乎装着什么道具. 湖边还有一个船夫,船夫告诉主角.他可以载着主角到任意一个岛上,并且可以从任意一个岛上再载着主角回到湖边,但是主角只有一次来回的机会

hiho一下 第九十八周 题目1 : 搜索一&#183;24点

题目1 : 搜索一·24点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 周末,小Hi和小Ho都在家待着. 在收拾完房间时,小Ho偶然发现了一副扑克,于是两人考虑用这副扑克来打发时间. 小Ho:玩点什么好呢? 小Hi:两个人啊,不如来玩24点怎么样,不靠运气就靠实力的游戏. 小Ho:好啊,好啊. <经过若干局游戏之后> 小Ho:小Hi,你说如果要写个程序来玩24点会不会很复杂啊? 小Hi:让我想想. <过了几分钟> 小Hi:我知道了!其实很简单嘛.