Bruce是K國的商人,他在A州成立了本身的公司,此次他的公司生產出了一批性能很好的產品,準備宣傳活動開始後的第L天到達B州進行新品拍賣,期間Bruce打算將產品拿到各個州去作推銷宣傳,以增長其影響力。 ios
K國有不少個州,每一個州都與其餘一些州相鄰,可是K國對商人做宣傳卻有一些很奇怪的規定:
一、 商人只能從某些州到達另一些州,即連通路線是單向的,並且有些州多是到達不了的。
二、 商人不容許在同一個州連續宣傳兩天或以上,天天宣傳完必須離開該州。
三、 商人能夠屢次來到同一個州進行宣傳。 性能
"我必須找出一條影響力最大的路線才行",Bruce想,"但我首先必須知道到底有多少這種符合規定的宣傳路線可供我選擇。"如今Bruce把任務交給了你。而且出於考慮之後的須要,你還要幫他算出給出的兩州之間的路線的總數。 spa
4 5 6 1 2 2 3 3 4 4 1 2 4 2 1 4 4 2
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; }