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$,要求输出$ ...
随机推荐
- DataWorks使用小结(一)——概述
一.概述 DataWorks数据工场,是MaxComputer的可视化开发平台,一站式开发.管理界面 1.功能概述 1.强大调度:支持分钟到月的调度 2.多种任务:支持ODPS.SHELL等多种任务 ...
- SequenceFile文件
SequenceFile文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File).目前,也有不少人在该文件的基础之上提出了一些HDFS中小文件存储的解决方案 ...
- 关于用tesseract和tesserocr识别图片的一个问题
对于像我这样初学python网络爬虫的freshman来说,软件的准备和环境的配置能让我们崩溃.其中用刚安装好的tesseract和tesserocr库测试识别验证码就是其中一例. 这里我要测试的验证 ...
- 分布式监控系统Zabbix-批量添加聚合图形
之前部署了Zabbix(3.4.4版本)监控环境,由于主机比较多,分的主机组也比较多,添加聚合图形比较麻烦,故采用python脚本进行批量添加聚合图形.脚本下载地址:https://pan.baidu ...
- Tomcat利用MSM实现Session共享方案解说
Session共享有多种解决方法,常用的有四种:1)客户端Cookie保存2)服务器间Session同步3)使用集群管理Session(如MSM) 4)把Session持久化到数据库 针对上面Sess ...
- linux下expect环境安装以及简单脚本测试
expect是交互性很强的脚本语言,可以帮助运维人员实现批量管理成千上百台服务器操作,是一款很实用的批量部署工具!expect依赖于tcl,而linux系统里一般不自带安装tcl,所以需要手动安装 下 ...
- Ansible之playbook的使用总结 - 运维笔记
之前详细介绍了Ansible的安装, 配置, 以及Ansible常用模块的使用. 下面对Ansible的playbook用法做一小结. 为什么引入playbook?一般运维人员完成一个任务, 比如安装 ...
- Python-复习-文件操作-21
# 文件处理 # 打开文件 #open('路径','打开方式','指定编码方式') # 打开方式 r w a r+ w+ a+ b #r+ 打开文件直接写 和读完再写 # 编码方式 —— utf-8 ...
- 《linux内核设计与实现》读书笔记——第三章
- T-shirt 0 0....
老师给我这件T-shirt的目的是为了让我减肥吗...... 听说了pbb的事迹好感动 //偷偷吐槽一句,那个全套吉米多维奇可以报销吗...我就看了2行........ 吓得我赶紧看了一下浴盆的气球