1. 程式人生 > 實用技巧 >【HDU2157】How many ways??

【HDU2157】How many ways??

題目連結

How many ways??

題目描述

春天到了, HDU校園裡開滿了花, 奼紫嫣紅, 非常美麗. 蔥頭是個愛花的人, 看著校花校草競相開放, 漫步校園, 心情也變得舒暢. 為了多看看這迷人的校園, 蔥頭決定, 每次上課都走不同的路線去教室, 但是由於時間問題, 每次只能經過\(k\)個地方, 比方說, 這次蔥頭決定經過\(2\)個地方, 那他可以先去問鼎廣場看看噴泉, 再去教室, 也可以先到體育場跑幾圈, 再到教室. 他非常想知道, 從A 點恰好經過\(k\)個點到達B點的方案數, 當然這個數有可能非常大, 所以你只要輸出它模上\(1000\)的餘數就可以了. 你能幫幫他麼?? 你可決定了蔥頭一天能看多少校花哦

輸入格式

輸入資料有多組, 每組的第一行是\(2\)個整數\(n\),\(m\)(\(0 < n \le 20\),\(m \le 100\)) 表示校園內共有\(n\)個點, 為了方便起見, 點從\(0\)\(n-1\)編號,接著有\(m\)行, 每行有兩個整數\(s\),\(t\)(\(0 \le s\),\(t<n\)) 表示從\(s\)點能到\(t\)點, 注意圖是有向的.接著的一行是兩個整數\(T\),表示有\(T\)組詢問(\(1 \le T \le 100\)),
接下來的\(T\)行, 每行有三個整數\(A\),\(B\),\(k\), 表示問你從\(A\)點到\(B\)點恰好經過\(k\)

個點的方案數(\(k < 20\)), 可以走重複邊。如果不存在這樣的走法, 則輸出\(0\)
\(n\),\(m\)都為\(0\)的時候輸入結束

輸出格式

計算每次詢問的方案數, 由於走法很多, 輸出其對\(1000\)取模的結果

樣例輸入

4 4
0 1
0 2
1 3
2 3
2
0 3 2
0 3 3
3 6
0 1
1 0
0 2
2 0
1 2
2 1
2
1 2 1
0 1 3
0 0

樣例輸出

2
0
1
3

題解

資料範圍很小,直接暴力dp就能過。
\(dp[i][j][k]\)表示從\(i\)\(j\)走了\(k\)個點的方案數,直接列舉邊轉移就好了。
注意:有多組資料
上程式碼:

#include<bits/stdc++.h>
#define mod 1000
using namespace std;
int n,m;
struct aa{
    int to,nxt;
}p[109];
int h[109],len;
bool kk[29][29];
int x,y;
int t;
int a,b,k;
void add(int u,int v){
    p[++len].to=v;
    p[len].nxt=h[u];
    h[u]=len;
}
int dp[29][29][29];
int main(){
    while(1){
        memset(dp,0,sizeof(dp));
        memset(kk,0,sizeof(kk));
        memset(h,0,sizeof(h));
        scanf("%d%d",&n,&m);
        if(n==0 && m==0) break;
        len=0;
        for(int j=1;j<=m;j++){
            scanf("%d%d",&x,&y);
            kk[x][y]=1;
        }
        for(int q=0;q<n;q++){
            dp[q][q][0]=1;
            for(int s=0;s<20;s++){
                for(int i=0;i<n;i++){
                    for(int j=0;j<n;j++){
                        if(kk[i][j]){
                            dp[q][j][s+1]+=dp[q][i][s];
                            dp[q][j][s+1]%=mod;
                        }
                    }
                }
            }
        }
        scanf("%d",&t);
        while(t--){
            scanf("%d%d%d",&a,&b,&k);
            printf("%d\n",dp[a][b][k]);
        }
    }
    return 0;
}