# b062. 1. 城市道路連通網 ##### link: https://zerojudge.tw/ShowProblem?problemid=b062 ###### tags: `Graph` `dp` ### 解法一:DFS( 最原始想法) * 原本直接暴力DFS,會TLE。 * 需要記錄走過的狀態(當前城市 & 當前公里數) * 下面程式碼中的 $record[cur][dis] = (cur==b)$ (14行) 意思是只要遞迴尋訪到目標城市( 不論當前公里數多少 ),則視為全新的一種走法,接著再由這個點往前推,看是否有其他解法,最後到達遞迴終點時在將路徑上的方法數加總,即為總方法數。 ```C++= #include <bits/stdc++.h> using namespace std; int n; int a, b, r; int ans = 0; string s; set<vector<int>> st; int dfs (int cur, int dis, vector<vector<int>>&table, vector<vector<int>> &record){ if (dis>r) return 0; // 遞迴終點 if (record[cur][dis]!=-1) return record[cur][dis]; record[cur][dis] = (cur==b); for (auto i:table[cur]){ record[cur][dis]+=dfs(i,dis+1,table,record); // 每一個和 cur 節點有連通 的城市都跑一次,把方法數加起來 } return record[cur][dis]; } int main (){ ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); while (cin >> n){ cin.get (); vector < vector < int >>table (n); // 存圖,第 i 個城市和第 j 個城市連通 for (int i = 0; i < n; i++){ getline (cin, s); for (int j = 0; j < n; j++){ if (s[j] == '1'){ table[i].push_back (j); } } } cin >> a >> b >> r; vector<vector<int>> record(n,vector<int>(r+1,-1)); // 陣列儲存的內容是該城市在某個公里數所有的走法數 a--; b--; cout << dfs (a, 0, table, record)<< "\n"; } return 0; } ``` ### 解法二:DP * 建立一個 $DP[x][y]$,$x$ 代表城市,$y$ 代表走的公里數 * 窮舉每一個走的公里數 $y$ ( 1~最大公里數 ),每次都針對每一個城市進行計算,當兩個城市相連時( 如 $a$, $b$ 兩個城市): <font color="ff123">$DP[a][y]+=DP[b][y-1]$</font> * 最後輸出 $\sum_{k=1}^{N}DP[j][k]$ => $j$ 代表目標城市 ```C++= #include <bits/stdc++.h> using namespace std; int n; int a, b, r; int ans = 0; string s; int main (){ ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); while (cin >> n){ cin.get (); vector < vector < int >>table (n); ans=0; for (int i = 0; i < n; i++){ getline (cin, s); for (int j = 0; j < n; j++){ if (s[j] == '1'){ table[i].push_back (j); } } } cin >> a >> b >> r; vector<vector<int>> dp(n,vector<int>(r+1,0)); a--; b--; dp[a][0]=1; for (int i=1;i<=r;i++){ for (int j=0;j<n;j++){ for (auto k:table[j]){ dp[j][i]=dp[j][i]+dp[k][i-1]; } } } for (int i=1;i<=r;i++){ ans+=dp[b][i]; } cout<<ans<<"\n"; } return 0; } ```