牛客小白月賽21

牛客小白月賽21


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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章