sicily 1211 商人的宣傳

Description

 Bruce是K國的商人,他在A州成立了本身的公司,此次他的公司生產出了一批性能很好的產品,準備宣傳活動開始後的第L天到達B州進行新品拍賣,期間Bruce打算將產品拿到各個州去作推銷宣傳,以增長其影響力。 ios

K國有不少個州,每一個州都與其餘一些州相鄰,可是K國對商人做宣傳卻有一些很奇怪的規定:
一、 商人只能從某些州到達另一些州,即連通路線是單向的,並且有些州多是到達不了的。
二、 商人不容許在同一個州連續宣傳兩天或以上,天天宣傳完必須離開該州。
三、 商人能夠屢次來到同一個州進行宣傳。 性能

"我必須找出一條影響力最大的路線才行",Bruce想,"但我首先必須知道到底有多少這種符合規定的宣傳路線可供我選擇。"如今Bruce把任務交給了你。而且出於考慮之後的須要,你還要幫他算出給出的兩州之間的路線的總數。 spa

Input

輸入文件第一行包含三個整數n,m,L(1≤n,L≤100),分別表示K國的州數、連通路線的數量,以及多少天后必須到達B州。接下來有m行,每行一隊整數x,y(1≤x,y≤n),表示商人能從x州到達y州。
第m+2行爲一個整數q(1≤q≤100),表示Bruce有q個詢問。下面q行每行兩個整數A,B(1≤A,B≤n),即A、B州的位置。

Output

輸出文件包含q行,每行一個整數t,爲所求的從A州到B州知足上述規定的路線總數。
輸入數據中的詢問將保證答案t在長整數範圍內,即t<2 31

Sample Input

4 5 6
1 2
2 3
3 4
4 1
2 4
2
1 4
4 2

Sample Output

2
1

分析:

比較偷懶的作法是直接使用矩陣乘法。具體作法是,能夠初始化地圖矩陣m1全部節點爲0,而後一旦聯通則設爲1,那麼2天內由A到B的方法爲M1*M1後獲得的矩陣的第a行第b列,遞推能夠知道第l天方法數爲矩陣嗎m1連乘l-1次所得矩陣。這種方法寫法簡便,可是速度可能稍慢。 code

代碼:

// Problem#: 1211
// Submission#: 1899573
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <iostream>
#include <cstring>
using namespace std;

#define MAX 100

int main() {
    int a, b;
    int m1[MAX][MAX] = {0};
    int m2[MAX][MAX] = {0};
    int m3[MAX][MAX] = {0};
    int n, m, l, q;
    cin >> n >> m >> l;
    while (m--) {
        cin >> a >> b;
        ++m1[a - 1][b - 1];
        ++m2[a - 1][b - 1];
    }
    for (int c = 0; c < l - 1; ++c) {
        memset(m3, 0, sizeof(m3));
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j)
                for(int k = 0; k < n; ++k)
                    m3[i][j] += m1[i][k] * m2[k][j]; 
        }
        memcpy(m1, m3, sizeof(m1));
    }
    cin >> q;
    while (q--) {
        cin >> a >> b;
        cout << m3[a - 1][b - 1] << endl;
    }
    return 0;
}
相關文章
相關標籤/搜索