给出N个点,M条边。Q次询问

Q次询问每两点之间的最短距离

典型LCA 问题   Marjan算法解

#include "stdio.h"
#include "string.h" struct Edge
{
int to,next,len;
}edge[20010]; struct Ques
{
int to,next,index;
}ques[2000010];
int head[10010],q_head[10010],f[10010],dis[10010]; int vis[10010],ans[1000010];
// vis记录结点是否被遍历过,而且存储结点所在的树是哪颗
// ans记录每一个询问的答案
int n,m,q,tot,q_tot; void add_edge(int a,int b,int c)
{
edge[tot].to=b;
edge[tot].next=head[a];
edge[tot].len=c;
head[a]=tot++; edge[tot].to=a;
edge[tot].next=head[b];
edge[tot].len=c;
head[b]=tot++;
} void add_ques(int a,int b,int index)
{
ques[q_tot].to=b;
ques[q_tot].next=q_head[a];
ques[q_tot].index=index;
q_head[a]=q_tot++; ques[q_tot].to=a;
ques[q_tot].next=q_head[b];
ques[q_tot].index=index;
q_head[b]=q_tot++;
} int find(int w)
{
if (f[w]==w) return w;
return f[w]=find(f[w]);
} void Tarjan(int w,int deep,int root) // w:当前点,deep:当前深度,root:根节点
{
int i,v;
f[w]=w;
vis[w]=root;
dis[w]=deep; for (i=q_head[w];i!=-1;i=ques[i].next)
{
v=ques[i].to;
if (vis[v]==root)
ans[ques[i].index]=dis[v]+dis[w]-2*dis[find(v)];
} for (i=head[w];i!=-1;i=edge[i].next)
{
v=edge[i].to;
if (vis[v]==-1)
{
Tarjan(v,deep+edge[i].len,root);
f[v]=w;
}
}
}
void init()
{
int i,a,b,c;
memset(head,-1,sizeof(head));
memset(q_head,-1,sizeof(q_head));
tot=q_tot=0; while (m--)
{
scanf("%d%d%d",&a,&b,&c);
add_edge(a,b,c);
} for (i=1;i<=q;i++)
{
scanf("%d%d",&a,&b);
add_ques(a,b,i);
}
memset(vis,-1,sizeof(vis));
memset(ans,-1,sizeof(ans));
}
int main()
{
int i;
while (scanf("%d%d%d",&n,&m,&q)!=EOF)
{
init();
for (i=1;i<=n;i++)
if (vis[i]==-1)
Tarjan(i,0,i); for (i=1;i<=q;i++)
if (ans[i]==-1)
printf("Not connected\n");
else
printf("%d\n",ans[i]);
}
return 0;
}

最新文章

  1. DLL组件注册器
  2. 基于Centos7+Nginx+Tomcat8的负载均衡服务器的搭建
  3. mysql通用包安装
  4. Varnish常用相关命令工具
  5. mottoes
  6. iframe实现面页无刷新提交表单
  7. sum(iterable[, start]) 对集合求和
  8. C++异常处理小例
  9. python的reduce()函数
  10. JavaScript------for-in的使用方法
  11. 游戏开发之在UE4中编写C++代码控制角色
  12. const用法体会
  13. 手机端扫描证件识别SDK
  14. docker容器跑redis
  15. 手把手教你“将系统安装在U盘”上,实现个人系统随身带!
  16. Confluence 6 在编辑器中控制参数的显示
  17. mac idea中的文件在finder中打开
  18. js offset
  19. arpspoof+ettercap嗅探局域网HTTP/HTTPS账号密码
  20. Mysql Windows 7 异常关闭, 2003 - Can&#39;t connect to Mysql server on &#39;localhost&#39; (10061) &quot;Unknown error&quot;)

热门文章

  1. 【转】git rebase简介(基本篇)
  2. [HTML&amp;CSS] 条件注释判断浏览器
  3. 27. Remove Element[E]移除元素
  4. Ubuntu16.04下将hadoop2.7.3源代码导入到eclipse neon中
  5. Vim常用又容易忘的命令
  6. 洛谷P2391 白雪皑皑(并查集)
  7. 使用Storm实现实时大数据分析!
  8. 编写jQuery 插件
  9. RabbitMQ学习之spring-amqp的重要类的认识
  10. Jquery 研究 入口