LCA最近公共祖先(least common ancestors)
2024-10-11 13:08:09
#include"stdio.h"
#include"string.h"
#include"iostream"
#include"queue"
#define M 111111
using namespace std;
struct st
{
int u,v,next,w;
}edge[M*2];
int rank[M],head[M],t,pre[M],use[M],dis[M];
void init()
{
t=0;
memset(head,-1,sizeof(head));
}
void add(int a,int b,int w)
{
edge[t].u=a;
edge[t].v=b;
edge[t].w=w;
edge[t].next=head[a];
head[a]=t++;
}
void bfs(int s)
{
queue<int>q;
memset(use,0,sizeof(use));
memset(rank,0,sizeof(rank));
use[s]=1;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(!use[v])
{
use[v]=1;
rank[v]=rank[u]+1;
pre[v]=u;
dis[v]=edge[i].w;
q.push(v);
}
}
}
}//用bfs对点进行分层
int targan(int a,int b)
{
int sum=0;
while(a!=b)
{
if(rank[a]>rank[b])
{
sum+=dis[a];
a=pre[a];
}
else
{
sum+=dis[b];
b=pre[b];
}
}
return sum;
}//查找
/*int targan(int a,int b)
{
if(a==b)
return a;
else if(rank[a]>rank[b])
return targan(pre[a],b);
else
return targan(a,pre[b]);
}*/深搜写法
int main()
{
int n,m,a,i,b,c;
while(scanf("%d%d",&n,&m)!=-1)
{
init();
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
bfs(1);
for(i=1;i<=n;i++)
printf("%d ",rank[i]);
while(scanf("%d%d",&a,&b)!=-1)
{
int ans=targan(a,b);
printf("%d\n",ans);
}
}
}
最新文章
- 【代码笔记】iOS-字符串的分割
- CentOS 7.2 安装配置Samba服务器
- sorttable
- oracle--创建表空间、用户名、密码
- nagios&ndash;配置文件
- C语言-04函数
- 学习window系统下的注册表
- pacejs进度条监控服务端数据加载是否完毕
- Uva 3708 Graveyard
- 区块链之智能合约 solidity踩坑 --上篇
- win10蓝屏,windbg的使用
- 阿里云上 配置 vsftpd 配置文件 (一个成功例子)
- jsp / get 中文乱码问题
- protected 与 internal
- javascript数据结构与算法--二叉树遍历(先序)
- android 虚拟键盘控制
- UIScrollView 去掉下面的滚动条
- 机器学习第7周-炼数成金-支持向量机SVM
- MySQL的索引是什么?怎么优化?
- 软件工程 part4 评价3作品 修改