想法:
將每個點能連到哪些點存起來,然後對每個點使用DFS看該點最遠能走多深。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cstdio> | |
#include <vector> | |
using namespace std; | |
int DFS (int node, vector<int> toNode[30], int dis, bool visit[][30]) | |
{ | |
int longest_length = 0; // 當前node能走的最遠距離 | |
for (int nxt_node : toNode[node]){ | |
if (!visit[node][nxt_node]) { // 該條線還沒走過 | |
visit[node][nxt_node] = 1; | |
visit[nxt_node][node] = 1; // 雙向關閉 | |
int length = DFS (nxt_node, toNode, dis+1, visit); | |
if (length > longest_length) longest_length = length; | |
visit[node][nxt_node] = 0; | |
visit[nxt_node][node] = 0; // 雙向開啟 | |
} | |
} | |
if (longest_length == 0) return dis; //如果走到底 回傳當前距離 | |
else return longest_length; //否則回傳該點能走的最長距離 | |
} | |
int main() | |
{ | |
// freopen("input.txt","rt",stdin); | |
int n, m; | |
while (scanf("%d%d", &n, &m)) { | |
if (!n && !m) break; | |
vector<int> toNode[30]; // toNode[i]儲存i_node能走向哪幾個點 | |
for (int i=0, n1, n2; i<m; ++i) { | |
scanf("%d%d", &n1, &n2); | |
toNode[n1].push_back(n2); | |
toNode[n2].push_back(n1); | |
} | |
bool visit[30][30] = {0}; //visit[i][j]=1 表示i_j這條線已經走過 | |
int longest = 0; | |
for (int i=0; i<n; ++i){ | |
int length = DFS(i, toNode, 0, visit); | |
if (length > longest) | |
longest = length; | |
} | |
printf("%d\n", longest); | |
} | |
} |
沒有留言:
張貼留言