The Shortest Statement CodeForces - 1051F(待测试)
#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#define rap(i, a, n) for(int i=a; i<=n; i++)
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _ ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int maxn = * 1e5 + , INF = 0x7fffffff;
LL n, m, cnt1, cnt2, c;
LL head1[maxn], head2[maxn], f[maxn], vis[maxn], bz[maxn];
LL dis[][maxn], d[maxn];
LL res[maxn];
vector<LL> se;
struct node
{
LL u, v, w, next;
}Node[maxn]; struct edge
{
LL u, v, id, next;
}Edge[maxn]; void add1_(LL u, LL v, LL w)
{
Node[cnt1].u = u;
Node[cnt1].v = v;
Node[cnt1].w = w;
Node[cnt1].next = head1[u];
head1[u] = cnt1++;
} void add1(LL u, LL v, LL w)
{
add1_(u, v, w);
add1_(v, u, w);
} void add2_(LL u, LL v, LL id)
{
Edge[cnt2].u = u;
Edge[cnt2].v = v;
Edge[cnt2].id = id;
Edge[cnt2].next = head2[u];
head2[u] = cnt2++;
} void add2(LL u, LL v, LL id)
{
add2_(u, v, id);
add2_(v, u, id);
} LL find(LL x)
{
return f[x]==x?x:(f[x] = find(f[x]));
} LL lca(LL u, LL deep, LL root)
{
f[u] = u;
d[u] = deep;
vis[u] = root; // 标记属于的树
for(LL i=head1[u]; i!=-; i=Node[i].next)
{
node e = Node[i];
if(vis[e.v] == -)
{
bz[i/] = ;
lca(e.v, deep+e.w, root);
f[e.v] = u;
}
}
for(LL i=head2[u]; i!=-; i=Edge[i].next)
{
edge e = Edge[i];
if(vis[e.v] == root) //判断另一个结点是不是和u属于一个树
{
LL k = find(e.v); //寻找最近公共祖先
res[e.id] = d[u] + d[e.v] - *d[k];
}
}
} void spfa(LL s, LL id)
{
for(LL i=; i<=n; i++) dis[id][i] = INF;
mem(vis, );
queue<LL> Q;
Q.push(s);
vis[s] = ;
dis[id][s] = ;
while(!Q.empty())
{
LL u = Q.front(); Q.pop();
vis[u] = ;
for(LL i=head1[u]; i!=-; i=Node[i].next)
{
node e = Node[i];
if(dis[id][e.v] > dis[id][u] + e.w)
{
dis[id][e.v] = dis[id][u] + e.w;
if(!vis[e.v])
{
Q.push(e.v);
vis[e.v] = ;
}
}
}
}
} void init()
{
mem(head1, -);
mem(head2, -);
mem(res, -);
mem(vis, -);
cnt1 = cnt2 = ;
} int main()
{
cin >> n >> m;
init();
rap(i, , m)
{
LL u, v, w;
scanf("%lld%lld%lld", &u, &v, &w);
add1(u, v, w);
}
cin >> c;
for(LL i=; i<=c; i++)
{
LL u, v;
scanf("%lld%lld", &u, &v);
add2(u, v, i);
}
for(LL i=; i<=n; i++)
if(vis[i] == -)
lca(i, , i);
mem(vis, -);
for(LL i=; i<cnt1; i++)
{
if(!bz[i/])
{
if(vis[Node[i].u] == -) se.push_back(Node[i].u), vis[Node[i].u] = ;
if(vis[Node[i].v] == -) se.push_back(Node[i].v), vis[Node[i].v] = ;
}
}
for(LL i=; i<se.size(); i++)
{
// cout << se[i] << endl;
spfa(se[i], i); } for(LL i=; i<=c; i++)
{
for(LL j=; j<se.size(); j++)
res[i] = min(res[i], dis[j][Edge[i*-].u] + dis[j][Edge[i*-].v]);
printf("%lld\n", res[i]);
} return ;
}
The Shortest Statement
The Shortest Statement CodeForces - 1051F(待测试)的更多相关文章
- The Shortest Statement CodeForces - 1051F 最小生成树+并查集+LCA
题目描述 You are given a weighed undirected connected graph, consisting of n vertices and mm edges. You ...
- codeforces 1051F The Shortest Statement
题目链接:codeforces 1051F The Shortest Statement 题意:\(q\)组询问,求任意两点之间的最短路,图满足\(m-n\leq 20\) 分析:一开始看这道题:fl ...
- Codeforces 1051E Vasya and Big Integers&1051F The Shortest Statement
1051E. Vasya and Big Integers 题意 给出三个大整数\(a,l,r\),定义\(a\)的一种合法的拆分为把\(a\)表示成若干个字符串首位相连,且每个字符串的大小在\(l, ...
- Educational Codeforces Round 51 (Rated for Div. 2) F - The Shortest Statement 倍增LCA + 最短路
F - The Shortest Statement emmm, 比赛的时候没有想到如何利用非树边. 其实感觉很简单.. 对于一个询问答案分为两部分求: 第一部分:只经过树边,用倍增就能求出来啦. 第 ...
- Educational Codeforces Round 51 (Rated for Div. 2) The Shortest Statement
题目链接:The Shortest Statement 今天又在群里看到一个同学问$n$个$n$条边,怎么查询两点直接最短路.看来这种题还挺常见的. 为什么最终答案要从42个点的最短路(到$x,y$) ...
- CF 1051 F. The Shortest Statement
F. The Shortest Statement http://codeforces.com/contest/1051/problem/F 题意: n个点,m条边的无向图,每次询问两点之间的最短路. ...
- 【题解】Luogu CF1051F The Shortest Statement
原题传送门:CF1051F The Shortest Statement 题目大意,给你一个稀疏图,q次查询,查询两点之间距离 边数减点小于等于20 这不是弱智题吗,23forever dalao又开 ...
- CF_Edu.#51_Div.2_1051F_The Shortest Statement
F. The Shortest Statement time limit per test:4 seconds memory limit per test:256 megabytes input:st ...
- [Codeforces 1051F] The Shortest Statement 解题报告(树+最短路)
题目链接: https://codeforces.com/contest/1051/problem/F 题目大意: 给出一张$n$个点,$m$条边的带权无向图,多次询问,每次给出$u,v$,要求输出$ ...
随机推荐
- Java多线程编程模式实战指南(二):Immutable Object模式
多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线 ...
- C# LINQ 详解 From Where Select Group Into OrderBy Let Join
目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. ...
- GATT服务搜索流程(二)
关于bta_dm_cb.p_sec_cback,这里我们之前已经分析过,他就是bte_dm_evt ,最终调用的函数btif_dm_upstreams_evt : static void btif_d ...
- 案例学Python--案例四:Django实现一个网站的雏形(1)
第一次用python的Web框架,也是第一次听说Django,参考菜鸡教程和一些博客,倒腾了半天,算是有一个雏形.数据基于昨天爬的豆瓣电影信息,详见案例三. Python版本:3.7.1 Django ...
- 牛客多校第三场-A-PACM Team-多维背包的01变种
题目我就不贴了...说不定被查到要GG... 题意就是我们需要在P,A,C,M四个属性的限制下,找到符合条件的最优解... 这样我们就需要按照0/1背包的思路,建立一个五维度数组dp[i][j][k] ...
- Notes of Daily Scrum Meeting(12.24)
平安夜了,我们还在这里辛苦地赶代码,整个人都不好了... 今天的团队任务总结如下: 团队成员 今日团队工作 陈少杰 寻找大神帮助,调试网络连接 王迪 建立搜索的UI界面,把算法加入进去 金鑫 调试网络 ...
- Daily Scrumming* 2015.12.21(Day 13)
一.团队scrum meeting照片 大部分成员编译请假,故今天没有开scrum meeting 二.成员工作总结 姓名 任务ID 迁入记录 江昊 无 无 任务说明: 今日准备编译测验,请假 遇到问 ...
- 关于对springboot程序配置文件使用jasypt开源工具自定义加密
一.前言 在工作中遇到需要把配置文件加密的要求,很容易就在网上找到了开源插件 jasypt (https://github.com/ulisesbocchio/jasypt-spring-boot# ...
- 20172319 《Java程序设计教程》第8周学习总结
20172319 2018.04.24-05.03 <Java程序设计教程>第8周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考 ...
- SQLserver 进程被死锁问题解决
事务(进程ID xx)与另一个进程被死锁在 锁|通信缓冲区 资源上,并且已被选座死锁牺牲品.请重新运行该事务.Sqlserver 当出现这个错误时,如下图: 解决办法:更改数据库事务隔离级别 alte ...