HDU 4705 Y

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705

解析:要求三个不在同一路径的,我们可以先求出在同一路径的三个有多少种,然后减去就行了。

用dfs来遍历所有点,对于当前点node,研究它的每个分支p。三个点,node算一个,node的当前分支p里任取一个点,然后在不是p的地方在找一个。

注意:

1.需要手动扩栈      #pragma comment(linker, "/STACK:16777216")

2.long long的变量输入数去用%I64d,不要用%lld

3.强制类型转换的时候不要加括号

#pragma comment(linker, "/STACK:16777216")//手动扩栈

#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"vector"
using namespace std;
#define LL long long
#define Maxnode 100005

int N;
vector<int>graph[Maxnode];
int flag[Maxnode];		//标记是否遍历过此点
LL ans ;				//用来存储在同一条路径上的三个点的个数

int DFS(int node){
	int child_node = 0;
	flag[node] = 1;
	for(int i = 0 ; i < graph[node].size() ; i++){
		int v = graph[node][i];
		if(!flag[v]){  
			int temp = DFS(v);
			child_node += temp;
			ans += (LL)(N - 1 - child_node)*temp; 
			//关键步骤,计算每个节点的分支之间共有多少个同一路径的
		}
	}
	//child_node++; //加上自己
	return child_node+1;
}

int main(){
	while(scanf("%d",&N) != EOF){
		ans = 0;
		memset(flag,0,sizeof(flag));
		for(int i = 1; i <= N ; i++)
			graph[i].clear();
		int a,b;
		for(int i = 1; i <= N-1; i ++){
			scanf("%d%d",&a,&b);
			graph[a].push_back(b);
			graph[b].push_back(a);
		}
		DFS(1);
		LL sum = (LL)N*(N-1)*(N-2)/6; //N个节点中取3个
		//注意,不能变成((LL)N*(N-1)*(N-2)/6),会溢出的
		printf("%I64d\n",sum-ans);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值