列表

详情


NC14248. Treepath

描述

给定一棵n个点的树,问其中有多少条长度为偶数的路径。路径的长度为经过的边的条数。x到y与y到x被视为同一条路径。路径的起点与终点不能相同。

输入描述

第一行一个数n表示点的个数;
接下来n-1行,每行两个整数x,y表示边;
保证输入数据形成一棵树;
1<=n<=100000

输出描述

一行一个整数表示答案。

示例1

输入:

3
1 2
1 3

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java(javac 1.8) 解法, 执行用时: 823ms, 内存消耗: 37924K, 提交时间: 2019-05-11 20:07:36

import java.util.Scanner;


public class Main {
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int[] datas = new int[n+1];
		int i = 0,u,v,even = 1,odd = 0;
		long result = 0;
		while(++i < n){
			u = in.nextInt();
			v = in.nextInt();
			datas[v] = datas[u]+1;
			result += datas[v]%2==0?even++:odd++;
		}
		System.out.println(result);
	}

}

Python3 解法, 执行用时: 401ms, 内存消耗: 22300K, 提交时间: 2021-05-29 00:06:56

import sys
sys.setrecursionlimit(100000)

n = int(input())
g = [[] for _ in range(n)]
c = [0] * n
for _ in range(n - 1):
	u, v = map(int, input().split())
	g[u - 1].append(v - 1)
	g[v - 1].append(u - 1)

def dfs(u, p, x):
	c[u] = x
	for v in g[u]:
		if v != p: dfs(v, u, x ^ 1)
dfs(0, -1, 0)
x = sum(c)
ans = x * (x - 1) // 2 + (n - x) * (n - x - 1) // 2
print(ans)

C++14(g++5.4) 解法, 执行用时: 110ms, 内存消耗: 1920K, 提交时间: 2019-05-07 19:05:38

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int dep[200005];
int main()
{
    LL n,a,b,even = 1,odd = 0,res = 0;
    cin >> n;
    n--;
    while(n--)
    {
        cin >> a >> b;
        dep[b] = dep[a] + 1;
        res += dep[b] % 2 ? odd++ : even++;
    }
    cout << res<<endl;
}

C++11(clang++ 3.9) 解法, 执行用时: 75ms, 内存消耗: 2364K, 提交时间: 2020-03-01 15:03:52

#include<bits/stdc++.h>
using namespace std;
long long dp[100005],n,x,y,u,v,ans;
int main()
{
	cin>>n;
	for(int i=1;i<n;i++)
	{
		cin>>u>>v;
		dp[v]=dp[u]+1;
		ans+=dp[v]&1?x++:++y;
	}
	cout<<ans<<endl;
	return 0;
}

上一题