B.Bits
D.DDoS
題意:
給一個n個點m條邊得帶權有向無環圖(拓撲圖),邊權爲耗時
1號點可以任意時刻發送任意數量數據包,n號點接受到數據包之後,會屏蔽這一時刻後的所有數據包。
不同的數據包路徑不能相同,問n號點最多接受到多少個數據包
思路:
因爲接收到一個數據包之後後面的就接收不到了,所以要使得n號點接受最多的數據包,數據包必須同時到達。
這題有個難點是發現1號點可以通過調整數據包的發送時間,使得所有數據包同時到達n點,所以邊權是沒有用的。
因此這題就變成了1到n有多少種不同的路徑,在拓撲圖上dp計數即可。
還有就是題目保證無環但是不保證重邊,重邊算多條路徑。
code:
#include<bits/stdc++.h>
using namespace std;
const int maxm=1e5+5;
const int mod=20010905;
vector<int>g[maxm];
int in[maxm];
int d[maxm];
int n,m;
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int a,b,c;
cin>>a>>b>>c;
g[a].push_back(b);
g[b].push_back(a);
in[b]++;
}
queue<int>q;
q.push(1);
d[1]=1;
while(!q.empty()){
int x=q.front();
q.pop();
for(int v:g[x]){
in[v]--;
d[v]=(d[v]+d[x])%mod;
if(!in[v]){
q.push(v);
}
}
}
cout<<d[n]<<endl;
return 0;
}