【HDU 2874】Connections between cities(LCA)
dfs找出所有节点所在树及到树根的距离及深度及父亲。
i和j在一棵树上,则最短路为dis[i]+dis[j]-dis[LCA(i,j)]*2。
#include <cstring> #include <cstdio> #define N 10005 #define add(u,v,w) e[++cnt]=(edge){v,head[u],w};head[u]=cnt using namespace std; struct edge{ int to,next,w; }e[N<<1]; int head[N],cnt,f[N],dis[N],deep[N],tr[N],t; int fa(int i,int j){ while(i!=j) if(deep[i]>deep[j]) i=f[i]; else j=f[j]; return i; } void dfs(int x,int p){ tr[x]=t; deep[x]=deep[p]+1; f[x]=p; for(int i=head[x];i;i=e[i].next){ int v=e[i].to; if(v==p)continue; dis[v]=dis[x]+e[i].w; dfs(v,x); } } int main(){ int n,m,c,u,v,w; while(~scanf("%d%d%d",&n,&m,&c)){ memset(head,0,sizeof head); memset(f,0,sizeof f); cnt=t=0; for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); } for(int i=1;i<=n;i++) if(f[i]==0){ t++; dfs(i,0); } for(int i=1;i<=c;i++){ scanf("%d%d",&u,&v); if(tr[u]!=tr[v]) puts("Not connected"); else printf("%d\n",dis[u]+dis[v]-dis[fa(u,v)]*2); } } }
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆
标签:
LCA
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· 【译】.NET 升级助手现在支持升级到集中式包管理
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· Tinyfox 发生重大改版