码迷,mamicode.com
首页 > 其他好文 > 详细

hihoCoder挑战赛14-1224

时间:2015-08-31 19:37:50      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:赛车


解析:用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原创文章,转载请附加本文链接^_^

hihoCoder挑战赛14-1224

标签:

原文地址:http://blog.csdn.net/u013446688/article/details/48138353

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!