解题思路
首先确定使用图的BFS,因为BFS是由近到远一点点蔓延过去的。所以队列中的最后一个节点一定是距离给定节点最远的点。
代码实现
- vector模拟邻接表代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 2000;
int vis[MAXN];
//采用vector模拟图的邻接表存储方法
//求图中离给定节点最远的节点
//思路:bfs中最后的节点就是离给定节点最远的节点
struct edge{
int to;
edge(int t)
{
to = t;
}
};
vector <edge> G[MAXN];
void add_edge(int from, int to)
{
G[from].push_back(edge{to});
G[to].push_back(edge{from});
}
int bfs(int s)
{
queue<int> que;
int maxi = s;
que.push(s);
vis[s] = 1;
while (!que.empty())
{
maxi = que.front();
que.pop();
for (int i=0; i<G[maxi].size(); i++)
{
if (!vis[G[maxi][i].to])
{
vis[G[maxi][i].to] = 1;
que.push(G[maxi][i].to);
}
}
}
return maxi;
}
int main()
{
int n;
cin >> n;
for (int i=0; i<n; i++)
{
int from, to;
cin >> from >> to;
add_edge(from, to);
}
cout << bfs(0) << endl;
return 0;
}
- 邻接表代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 2000;
int vis[MAXN];
struct ArcNode {
int adjvex;
ArcNode *nextarc;
};
struct vNode {
char data;
ArcNode *firstarc;
};
struct Graph {
vNode adjlist[MAXN];
int n, e;
};
void create_Graph(Graph *&G, int n)
{
int from, to;
for (int i=0; i<n; i++)
{
cin >> from >> to;
ArcNode *s = new ArcNode;
s->adjvex = to;
s->nextarc = G->adjlist[from].firstarc;
G->adjlist[from].firstarc = s;
}
}
int bfs(Graph *G, int s)
{
queue<int> que;
int maxi = s;
que.push(s);
vis[s] = 1;
while (!que.empty())
{
ArcNode *p = G->adjlist[que.front()].firstarc;
maxi = que.front();
que.pop();
while (p)
{
if (!vis[p->adjvex])
{
vis[p->adjvex] = 1;
que.push(p->adjvex);
}
p = p->nextarc;
}
}
return maxi;
}
int main()
{
Graph *G = new Graph;
int n;
cin >> n;
create_Graph(G, n);
cout << bfs(G, 0) << endl;
return 0;
}