分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

[POJ 3417] Network

发布时间:2023-09-06 02:06责任编辑:顾先生关键词:暂无标签

[题目链接]

          http://poj.org/problem?id=3417

[算法]

         树上差分

[代码]

       

#include <algorithm> ?#include <bitset> ?#include <cctype> ?#include <cerrno> ?#include <clocale> ?#include <cmath> ?#include <complex> ?#include <cstdio> ?#include <cstdlib> ?#include <cstring> ?#include <ctime> ?#include <deque> ?#include <exception> ?#include <fstream> ?#include <functional> ?#include <limits> ?#include <list> ?#include <map> ?#include <iomanip> ?#include <ios> ?#include <iosfwd> ?#include <iostream> ?#include <istream> ?#include <ostream> ?#include <queue> ?#include <set> ?#include <sstream> ?#include <stdexcept> ?#include <streambuf> ?#include <string> ?#include <utility> ?#include <vector> ?#include <cwchar> ?#include <cwctype> ?#include <stack> ?#include <limits.h>using namespace std;#define MAXN 100010#define MAXLOG 20struct edge{ ???????int to,nxt;} e[MAXN << 1];int i,n,m,tot,u,v,ans;int sum[MAXN],dep[MAXN],head[MAXN];int anc[MAXN][MAXLOG];inline void addedge(int u,int v){ ???????tot++; ???????e[tot] = (edge){v,head[u]}; ???????head[u] = tot;}inline void dfs1(int u){ ???????int i,v; ???????for (i = 1; i < MAXLOG; i++) ???????{ ???????????????if (dep[u] < (1 << i)) break; ????????????????anc[u][i] = anc[anc[u][i - 1]][i - 1]; ???????} ???????for (i = head[u]; i; i = e[i].nxt) ???????{ ???????????????v = e[i].to; ???????????????if (v != anc[u][0]) ???????????????{ ???????????????????????dep[v] = dep[u] + 1; ???????????????????????anc[v][0] = u; ???????????????????????dfs1(v); ???????????????} ???????}}inline void dfs2(int u){ ???????int i,v; ???????for (i = head[u]; i; i = e[i].nxt) ???????{ ???????????????v = e[i].to; ???????????????if (v == anc[u][0]) continue; ???????????????dfs2(v); ???????????????sum[u] += sum[v]; ???????}}inline int lca(int u,int v){ ???????int i,t; ???????if (dep[u] > dep[v]) swap(u,v); ???????t = dep[v] - dep[u]; ???????for (i = 0; i < MAXLOG; i++) ???????{ ???????????????if (t & (1 << i)) ???????????????????????v = anc[v][i]; ???????} ???????if (u == v) return u; ???????for (i = MAXLOG - 1; i >= 0; i--) ???????{ ???????????????if (anc[u][i] != anc[v][i]) ???????????????{ ???????????????????????u = anc[u][i]; ???????????????????????v = anc[v][i]; ???????????????} ???????} ???????return anc[u][0];} int main() { ???????????????while (scanf("%d%d",&n,&m) != EOF) ???????{ ???????????????tot = 0; ???????????????memset(anc,0,sizeof(anc)); ???????????????memset(dep,0,sizeof(dep)); ???????????????for (i = 1; i <= n; i++) ????????????????{ ???????????????????????head[i] = 0; ???????????????????????sum[i] = 0; ???????????????} ???????????????for (i = 1; i < n; i++) ???????????????{ ???????????????????????scanf("%d%d",&u,&v); ???????????????????????addedge(u,v); ???????????????????????addedge(v,u); ???????????????} ???????????????dfs1(1); ???????????????for (i = 1; i <= m; i++) ???????????????{ ???????????????????????scanf("%d%d",&u,&v); ???????????????????????sum[u]++; sum[v]++; ???????????????????????sum[lca(u,v)] -= 2; ???????????????} ???????????????dfs2(1); ???????????????ans = 0; ???????????????for (i = 2; i <= n; i++) ???????????????{ ???????????????????????if (sum[i] == 0) ans += m; ???????????????????????if (sum[i] == 1) ans++; ???????????????} ???????????????printf("%d\n",ans); ???????} ???????????????return 0; ???}

[POJ 3417] Network

原文地址:https://www.cnblogs.com/evenbao/p/9382565.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved