無向圖 n≤25 點,m 條邊。每條邊最多用一次。求最長路徑(邊數最多)的長度。多測試用例,`0 0` 結束。
#includeusing namespace std; const int MAXN = 30; bool adj[MAXN][MAXN]; int n, m, maxLen; void dfs(int u, int len) { maxLen = max(maxLen, len); for (int v = 0; v < n; ++v) if (adj[u][v]) { adj[u][v] = adj[v][u] = false; dfs(v, len + 1); adj[u][v] = adj[v][u] = true; } } int main() { while (cin >> n >> m, n || m) { memset(adj, 0, sizeof(adj)); for (int i = 0; i < m; ++i) { int u, v; cin >> u >> v; adj[u][v] = adj[v][u] = true; } maxLen = 0; for (int i = 0; i < n; ++i) dfs(i, 0); cout << maxLen << '\n'; } return 0; }
無向圖最長路徑(邊不重複)。回溯 DFS 遍歷所有簡單路徑,n≤25 直接暴力可行。鄰接矩陣標記邊用過/回溯,全點作起點取最大值。經典「小規模圖窮舉」模板。