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$,要求输出$ ...
随机推荐
- oa tomcat 代码处理跨域问题
meta标签处理http.https跨域 <!-- 将http请求转成https请求 --> <meta http-equiv="Content-Security-Poli ...
- Python常见十六个错误集合,你知道那些?
使用python会出现各种各样的错误,以下是Python常见的错误以及解决方法. 1.ValueError: 'Conv2d_1a_3×3' is not a valid scope name 这个是 ...
- 利用H5本地存储localStorage、sessionStorage
最近的业务处理上,要使用cookie缓存储一下数据,公司的cookie还搞出点问题.而用户的浏览器都是利用微信的内置,普遍支持h5的本地存储.于是利用了这个... 现代浏览器普遍开始支持H5本地存储, ...
- Github.Git
Github介绍:http://www.yangzhiping.com/tech/github.html Git:http://res.crossincode.com/wechat/git.html
- CF888G Xor-MST 生成树、分治、Trie树合并
传送门 第一次接触到Boruvka求最小生成树 它的原版本是:初始每一个点构成一个连通块,每一次找到每一个连通块到其他的连通块权值最短的边,然后合并这两个连通块.因为每一次连通块个数至少减半,所以复杂 ...
- C# 如何物理删除有主外键约束的记录?存储过程实现
十年河东,十年河西,莫欺少年穷 本篇主旨是如何物理删除有主外键约束的记录!那么,我们从主外键走起! 下面新建三张有主外键约束的表,分别为:系/学院表,专业班表,学生表,如下: CREATE TABLE ...
- Spring Aop: 关于继承和execution target this @annotation
1.多态 target指通过这个对象调用的方法 (匹配标识对象的所有方法) getMethod() this指调用这个对象的方法 (匹配标识对象实现的方法) getDeclaredMethod( ...
- 介绍HTTP协议的传输过程
1.HTTP是面向事物的应用层协议,它使用TCP连接进行可靠传输,服务器默认监听在80端口 2.服务流程 从协议执行过程来说,当浏览器要访问www服务器时,首先要对服务器进行域名解析(DNS协议).一 ...
- C#抽象类跟接口
抽象类描述的是一个什么东西,属性. 抽象类是对类的抽象,描述是什么 抽象类,继承后重写接口描述的是他做什么,行为.接口是对行为的抽象,描述做什么 ,进行继承后实行接口
- Ceph分布式存储-原理介绍及简单部署
1)Ceph简单概述Ceph是一个分布式存储系统,诞生于2004年,最早致力于开发下一代高性能分布式文件系统的项目.Ceph源码下载:http://ceph.com/download/.随着云计算的发 ...