题目链接:赛车
解析:用down[]数组记录每个节点能向下走得最大深度,然后再枚举两个不在同一集合内的两点连接(若在同一集合,则会成环)。
AC代码:
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; int first[100005], nxt[100005], to[100005], e; int d[100005]; int down[100005]; int n; int fa[100005]; bool vis[100005]; int tail, len; void dfs(int u, int dis){ down[u] = 0; d[u] = dis; if(dis > len){ len = dis; tail = u; } for(int i=first[u]; i!=-1; i=nxt[i]){ int v = to[i]; if(d[v] == -1){ fa[v] = u; dfs(v, dis+1); } down[u] = max(down[u], down[v]+1); } } int main(){ // freopen("in.txt", "r", stdin); while(scanf("%d", &n) == 1){ tail = len = 0; memset(first, -1, sizeof(first)); e = 0; for(int i=0; i<n; i++){ int u, v; scanf("%d %d", &u, &v); nxt[e] = first[u]; to[e] = v; first[u] = e++; } memset(d, -1, sizeof(d)); memset(fa, -1, sizeof(fa)); dfs(1, 0); int last = tail; while(last != -1){ vis[last] = true; last = fa[last]; } int ans = len; for(int i=1; i<=n; i++){ if(vis[i]) continue; ans = max(ans, len+down[i]+1); } printf("%d\n", ans); } return 0; }
版权声明:本文为sxk原创文章,转载请附加本文链接^_^
时间: 2024-11-02 21:12:22