牛客小白月赛21-D.DDoS【拓扑图路径计数,边权无用】

题面:
Nancy的男朋友喜欢网络安全!
最近,一种新的DDoS——脉冲波悄然来临。其基本原理是利用不同线路服务器的延时,使得Request同时到达目标服务器,以堵塞其它正常的通讯。
不妨假设攻击者在1号节点,目标服务器在nn号节点,其余节点(2到n-1号节点)为中继服务器。
攻击者可以在任意时间发送一个定向数据包(即规定其经过中继服务器的路线,但不同数据包的路线不能完全相同),目标服务器对这种数据包具有100%的识别率,一旦识别到这种数据包,则会屏蔽这一时刻后的所有数据包。
Nancy好奇,攻击者在最优策略下,目标服务器能够收到多少份数据包呢?
输入描述:
第一行:两个整数n,m。
接下来m行:每行三个整数x,y,z,表示节点x与y可以单向通信(x到y),耗时为z。
数据满足:3≤n≤100000,1≤m≤200000,0≤z≤⌊10^πe⌋,图为拓扑图(有向无环图)。
输出描述:
共一行:表示攻击者在最优策略下,目标服务器能够收到数据包的数量。
由于数量可能会很大,你只需要输出答案对20010905取模后的值。
输入:
4 4
1 2 3
1 3 1
2 4 1
3 4 3
输出:
2

一开始理解错了题意,以为要求图的最短路径条数。看了题解后发现发送时间任意,那么就相当于只要求出1->n的路径数即可。
拓扑图的路径计数,正向建图,边权无用,记忆化搜索/dp。

#include 
using namespace std;
typedef long long ll;
const int mod=20010905;
const int N=1e5+5;
typedef pair<ll,int> P;
vector<P>pic[N];
ll path[N];
ll dfs(int p)
{
    if(path[p])
        return path[p];
    for(int i=0;i<pic[p].size();i++)
    {
        P tmp=pic[p][i];
        path[p]=(path[p]+dfs(tmp.second))%mod;
    }
    return path[p];
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int u,v;
    ll w;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&u,&v,&w);
        pic[u].push_back(make_pair(w,v));
    }
    path[n]=1;
    ll ans=dfs(1);//正向建图
    printf("%lld\n",ans%mod);
    return 0;
}

你可能感兴趣的:(#,牛客题目集,#,图论)