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的运算符--与(&)、非(~)、或(|)、异或(^)详解
一.计算机中存储的都是补码 java也是如此: System.out.println(Integer.toBinaryString(2)); System.out.println(Integer.to ...
- Bootstrap动态轮播
一.前台界面 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEn ...
- 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案)
主要功能:变灰,去噪,等提高清晰度等 代码类博客,无需多说,如下: public class UnCodebase { public Bitmap bmpobj; public UnCodebase( ...
- 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. ...
- 给 MSYS2 添加中科大的源
最近一段时间不知怎么的,使用默认的 MSYS2 源升级软件或是安装新软件的特别的慢.所以就翻了翻国内的几个开源软件的镜像库,发现中科大的库里就有 MSYS2.所以就研究了一下,给 MSYS2 添加了中 ...
- 基于vue2.0 +vuex+ element-ui后台管理系统:包括本地开发调试详细步骤
效果演示地址, github地址: demo演示: 1.About 此项目是 vue2.0 + element-ui + node+mongodb 构建的后台管理系统,所有的数据都是从 ...
- Linux服务器更换主板后,网卡识别失败的处理方法
1)现象说明公司IDC机房里的一台线上服务器硬件报警,最后排查发现服务器主板坏了,随即联系厂商进行更换主板,最后更换后,登录服务器,发现网卡绑定及ip信息都在,但是ip却ping不通了,进一步排查,重 ...
- 《Linux内核设计与实现》第四章读书笔记
4.1 多任务 多任务操作系统就是能同时并发地交互执行多个进程的操作系统. 多任务系统可以划分为两类: 非抢占式多任务进程会一直执行直到自己主动停止运行 抢占式多任务Linux/Unix使用的是抢占式 ...
- 个人作业 - Week3 - 案例分析
调研与评测 真实用户采访: 用户姓名: 刘斯盾 用户的背景和需求: 用户是一位计算机专业学生,需要浏览技术博客来扩充自己的学识. 用户使用博客园证明: 产品是否解决用户问题: 在码代码过程中遇到的很多 ...
- An internal error has occurred. Java heap space
http://stackoverflow.com/questions/11001252/running-out-of-heap-space issue: I am having a heap spac ...