NC201607. DDoS
描述
输入描述
第一行:两个整数n,m。
接下来m行:每行三个整数x,y,z,表示节点x与y可以单向通信(x到y),耗时为z。
数据满足:,,图为拓扑图(有向无环图)。
输出描述
共一行:表示攻击者在最优策略下,目标服务器能够收到数据包的数量。由于数量可能会很大,你只需要输出答案对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时刻到达目标服务器。C++14(g++5.4) 解法, 执行用时: 112ms, 内存消耗: 6756K, 提交时间: 2020-01-18 21:39:18
#include <bits/stdc++.h> using namespace std; const int N=1e5+5; const int MD=20010905; vector<int> G[N]; int in[N],f[N]; int main() { int n,m; scanf("%d%d",&n,&m); for(int i=0,u,v;i<m;i++) { scanf("%d%d%*d",&u,&v); G[u].push_back(v); in[v]++; } f[1]=1; queue<int> qu; qu.push(1); while(!qu.empty()) { int u=qu.front(); qu.pop(); for(int i=0;i<G[u].size();i++) { int v=G[u][i]; f[v]=(f[v]+f[u])%MD; if(--in[v]==0) qu.push(v); } } printf("%d\n",f[n]); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 68ms, 内存消耗: 15944K, 提交时间: 2020-08-09 21:45:07
#include<bits/stdc++.h> using namespace std; const int N=2e5+10,mod=20010905; int n,m,f[N]; vector<int>v[N]; int dfs(int x){ if(f[x])return max(f[x],0); for(int i=0;i<v[x].size();i++){ f[x]=(f[x]+dfs(v[x][i]))%mod; } if(!f[x])f[x]=-1; return max(f[x],0); } int main(){ scanf("%d%d",&n,&m); for(int i=1,x,y,z;i<=m;i++){ scanf("%d%d%d",&x,&y,&z); v[x].push_back(y); } f[n]=1; printf("%d\n",dfs(1)); return 0; }