SPOJ Problem 1437:Longest path in a tree

求树的最长链,BFS和DFS都可以,时间复杂度O(n)

#include<cstdio>
#include<cstring>
int tot,vt[20005],nxt[20005],a[20005];
bool vis[10005];
int n,i,j,xx,yy,s,ma,r;
void search(int x,int dep){
    int p;
    vis[x]=1;
    if (dep>ma){ma=dep;r=x;}
    p=a[x];
    while(p){
        if (!vis[vt[p]]){
            search(vt[p],dep+1);
        }
        p=nxt[p];
    }
}
void addnode(int x,int y){vt[++tot]=y;nxt[tot]=a[x];a[x]=tot;    }
int main (){
    scanf("%d",&n);
    for (i=1;i<n;i++){
        scanf("%d%d",&xx,&yy);
        addnode(xx,yy);
        addnode(yy,xx);
    }
    search(1,0);
    ma=0;
    memset(vis,0,n+1);
    search(r,0);
    printf("%d",ma);
}
时间: 2024-11-10 07:27:34

SPOJ Problem 1437:Longest path in a tree的相关文章

SP1437 Longest path in a tree(树的直径)

应该是模板题了吧 定义: 树的直径是指一棵树上相距最远的两个点之间的距离. 方法:我使用的是比较常见的方法:两边dfs,第一遍从任意一个节点开始找出最远的节点x,第二遍从x开始做dfs找到最远节点的距离即为树的直径. 证明:假设此树的最长路径是从s到t,我们选择的点为u.反证法:假设第一遍搜到的点是v. 1.v在这条最长路径上,那么dis[u,v]>dis[u,v]+dis[v,s],显然矛盾. 2.v不在这条最长路径上,我们在最长路径上选择一个点为po,则dis[u,v]>dis[u,po]

SPOJ 11840. Sum of Squares with Segment Tree (线段树,区间更新)

http://www.spoj.com/problems/SEGSQRSS/ SPOJ Problem Set (classical) 11840. Sum of Squares with Segment Tree Problem code: SEGSQRSS Segment trees are extremely useful.  In particular "Lazy Propagation" (i.e. see here, for example) allows one to c

SPOJ LCS2 1812. Longest Common Substring II

SPOJ Problem Set (classical) 1812. Longest Common Substring II Problem code: LCS2 A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the set of lowercase letters. Substring, also called factor, is a consecu

[LeetCode&amp;Python] Problem 559. Maximum Depth of N-ary Tree

Given a n-ary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. For example, given a 3-ary tree: We should return its max depth, which is 3. Note: The dept

Codechef:Path Triples On Tree

Path Triples On Tree 题意是求树上都不相交或者都相交的路径三元组数量. 发现blog里没什么树形dp题,也没有cc题,所以来丢一道cc上的树形dp题. 比较暴力,比较恶心 #include<cstdio> #include<algorithm> #define MN 300001 #define ui long long using namespace std; ui read_p,read_ca; inline ui read(){ read_p=0;read

spoj 1811 LCS - Longest Common Substring (后缀自动机)

spoj 1811 LCS - Longest Common Substring 题意: 给出两个串S, T, 求最长公共子串. 限制: |S|, |T| <= 1e5 思路: dp O(n^2) 铁定超时 后缀数组 O(nlog(n)) 在spoj上没试过,感觉也会被卡掉 后缀自动机 O(n) 我们考虑用SAM读入字符串B; 令当前状态为s,同时最大匹配长度为len; 我们读入字符x.如果s有标号为x的边,那么s=trans(s,x),len = len+1; 否则我们找到s的第一个祖先a,它

spoj 1812 LCS2 - Longest Common Substring II (后缀自动机)

spoj 1812 LCS2 - Longest Common Substring II 题意: 给出最多n个字符串A[1], ..., A[n], 求这n个字符串的最长公共子串. 限制: 1 <= n <= 10 |A[i]| <= 1e5 思路: 和spoj 1811 LCS差不多的做法 把其中一个A建后缀自动机 考虑一个状态s, 如果A之外的其他串对它的匹配长度分别是a[1], a[2], ..., a[n - 1], 那么min(a[1], a[2], ..., a[n - 1]

素数筛法--SPOJ Problem 2 Prime Generator

质数(prime number)又称素数,除了1和它本身外,不能整除以其他自然数,换句话说就是该数除了1和它本身以外不再有其他的因数:否则称为合数.最小的质数是2. 要判断一个整数N是不是质数很简单,看它是否能被2到sqrt(N)之间的整数整除即可. def isPrime(n): if n%2==0: return False for i in xrange(3,int(math.sqrt(n)+1),2): if n%i==0: return False return True 不过要找出1

spoj 1812 LCS2 - Longest Common Substring II (后缀自己主动机)

spoj 1812 LCS2 - Longest Common Substring II 题意: 给出最多n个字符串A[1], ..., A[n], 求这n个字符串的最长公共子串. 限制: 1 <= n <= 10 |A[i]| <= 1e5 思路: 和spoj 1811 LCS几乎相同的做法 把当中一个A建后缀自己主动机 考虑一个状态s, 假设A之外的其它串对它的匹配长度各自是a[1], a[2], ..., a[n - 1], 那么min(a[1], a[2], ..., a[n -