题目描述
Nancy的男朋友喜欢网络安全!
最近,一种新的DDoS——脉冲波悄然来临。其基本原理是利用不同线路服务器的延时,使得Request同时到达目标服务器,以堵塞其它正常的通讯。
不妨假设攻击者在1号节点,目标服务器在nnn号节点,其余节点(2到n-1号节点)为中继服务器。
攻击者可以在任意时间发送一个定向数据包(即规定其经过中继服务器的路线,但不同数据包的路线不能完全相同),目标服务器对这种数据包具有100%的识别率,一旦识别到这种数据包,则会屏蔽这一时刻后的所有数据包。
Nancy好奇,攻击者在最优策略下,目标服务器能够收到多少份数据包呢?
输入描述:
第一行:两个整数n,m。
接下来m行:每行三个整数x,y,z,表示节点x与y可以单向通信(x到y),耗时为z。
数据满足:3≤n≤100000,1≤m≤2000003 \leq n \leq 100000, 1 \leq m \leq 2000003≤n≤100000,1≤m≤200000,0≤z≤⌊10πe⌋0 \leq z \leq \lfloor10^{\pi e}\rfloor0≤z≤⌊10πe⌋,图为拓扑图(有向无环图)。
输出描述:
共一行:表示攻击者在最优策略下,目标服务器能够收到数据包的数量。
由于数量可能会很大,你只需要输出答案对20010905取模后的值。
示例1
输入
复制
4 4
1 2 3
1 3 1
2 4 1
3 4 3
输出
复制
2
说明
显然,攻击者在0时刻发送两个定向数据包(1-2-4和1-3-4),它们同时在第4时刻到达目标服务器。
题解这题是在最优策略下,所以也就是求1到n的所有路径
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
vector<int> g[N];
int n, m,d[N];
long long dp[N];
void work(){
long long mod = 20010905;
queue<int> q;
q.push(1);
dp[1] = 1;
while(!q.empty()){
int cd = q.front();
q.pop();
for(auto it:g[cd]){
dp[it] = (dp[it] + dp[cd])%mod;
d[it]--;
if(d[it]==0)
q.push(it);
}
}
printf("%lld\n", dp[n]);
}
int main(){
int u, v, w;
scanf("%d%d", &n, &m);
for (int i = 1; i <= m;i++){
scanf("%d%d%d", &u, &v, &w);
g[u].push_back(v);
d[v]++;
}
work();
}