DDoS

DDoS

题目描述
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();
}

发布了10 篇原创文章 · 获赞 1 · 访问量 179

猜你喜欢

转载自blog.csdn.net/weixin_45676038/article/details/104044975