b062: 1. 城市道路連通網

Tags: dp, graph


出處:https://zerojudge.tw/ShowProblem?problemid=b062
提交:https://zerojudge.tw/Submissions?problemid=b062&account=allllllan123456


問題:給定一張無向圖裡面至多 32 個城市彼此之間的連通關係,任兩個不同的城市之間只可能不連通,或者是用一條一公里的道路連接。現在想問你從 A 城市走到另一座 B 城市不超過 N 公里的走法總共有幾種?


解法:因為這題每張地圖的詢問都只有一個固定的起點,而且道路都是同樣的一公里,便用不到特殊的資料結構或算法,比較巧妙的計算方式可以是一個公里數一個公里數慢慢往上加,只要掌握住 s – (N) – t 的方法數為所有能滿足 s – (N-1) – i – (1) – t 的方法數總和即可,詳細作法可參考程式碼。


 1#include <bits/stdc++.h>
 2using namespace std;
 3
 4char adj[33][33]; // adjacency matrix
 5int m, dist[2][33];
 6
 7int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); // IO 優化
 8    while (cin >> m) {
 9        int start, end, length, ans=0;
10        for (int i=1; i<=m; i++) cin >> adj[i] + 1;
11        cin >> start >> end >> length;
12        memset(dist[0], 0, sizeof dist[0]);
13        dist[0][start] = 1;
14        if (start == end) ans++;
15        for (int d=1; d<=length; d++) {
16            for (int i=1; i<=m; i++) {
17                dist[d&1][i] = 0;
18                for (int j=1; j<=m; j++)
19                    if (adj[j][i] - '0')
20                        dist[d&1][i] += dist[d&1^1][j];
21            }
22            ans += dist[d&1][end];
23        }
24        cout << ans << '\n';
25    }
26    return 0;
27}

no image