题目大意


主要思路
使用并查集维护到根节点距离
AC代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <string>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <sstream>
using namespace std;
const int N = 100010;
int n, p[N], d[N];
int st[N];
int find(int x)
{
if(x != p[x])
{
int t = find(p[x]);
d[x] += d[p[x]];
p[x] = t;
}
return p[x];
}
int main(void)
{
scanf("%d", &n);
for(int i = 1; i <= n; i++) p[i] = i;
for(int i = 1; i <= n; i++)
{
int k, t, a;
t = find(i);
scanf("%d", &k);
while(k--)
{
scanf("%d", &a);
st[a] = 1;
int pa = find(a);
if(t != pa)//维护到根节点距离
{
p[pa] = t;
d[pa] = d[i] + 1;
}
}
}
int r;//求起点
for(int i = 1; i <= n; i++)
{
if(!st[i])
{
r = i;
break;
}
}
int res = -1, ans;
for(int i = 1; i <= n; i++)
{
if(find(i) == r && d[i] > res)
{
res = d[i];
ans = i;
}
}
cout << ans << endl;
return 0;
}
本文介绍了一种利用并查集数据结构解决最短路径问题的方法,通过维护每个节点到根节点的距离,找到从起点出发的最远节点。通过代码实例展示了如何在给定的树状结构中找到起点的最长路径。
1973

被折叠的 条评论
为什么被折叠?



