【 Educational Codeforces Round 51 (Rated for Div. 2) F】The Shortest Statement
【链接】 我是链接,点我呀:)
【题意】
【题解】
先处理出来任意一棵树。
然后把不是树上的边处理出来
对于每一条非树边的点(最多21*2个点)
在原图上,做dijkstra
这样就能处理出来这些非树边上的点到其他任意点的最短路了。
然后对于询问x,y
先用LCA+预处理,求出树上的最短路。
接下来考虑有非树边的情况。
显然只要枚举它经过了非树边上的点z
那么用dis[z][x]+dis[z][y]尝试更新ans就好。
只要枚举非树边上的点。
这是突破口。
【代码】
#include <bits/stdc++.h>
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)using namespace std;const int MAXN = 100000+10;
const int MAX = 17;vector <int> son[MAXN],w[MAXN];
int n,p[MAXN][MAX+5],dep[MAXN],pre[MAX+5],m;
long long dis[MAXN];
bool vis[MAXN+10];
LL F[45][MAXN];
set<int> myset;
set<pair<LL,int> > q;void dfs(int x,int f)
{vis[x] = true;dep[x] = dep[f] + 1;p[x][0] = f;for (int i = 1; i <= MAX; i++)p[x][i] = p[p[x][i - 1]][i - 1];int len = son[x].size();for (int i = 0; i <= len - 1; i++){int y = son[x][i];if (y != f){if (!vis[y]){dis[y] = dis[x] + w[x][i];dfs(y, x);}else{myset.insert(x);myset.insert(y);}}}
}long long getMinimalDistance(int t0,int t1){int pret0 = t0,pret1 = t1;if (dep[t0] > dep[t1]) swap(t0, t1);for (int i = MAX; i >= 0; i--)if (dep[t0] <= dep[t1] - pre[i])t1 = p[t1][i];if (t1 == t0) return dis[pret0]+dis[pret1]-2*dis[t0];for (int i = MAX; i >= 0; i--){if (p[t0][i] == p[t1][i])continue;t0 = p[t0][i], t1 = p[t1][i];}return dis[pret0]+dis[pret1]-2*dis[p[t0][0]];
}int main()
{#ifdef ccyfreopen("rush.txt", "r", stdin);#endifpre[0] = 1;for (int i = 1; i <= MAX; i++)pre[i] = pre[i - 1] << 1;int T;T = 1;while (T--){scanf("%d%d",&n,&m);for (int i = 1; i <= n; i++) son[i].clear(),w[i].clear();myset.clear();for (int i = 1; i <= m; i++){int x, y, z;scanf("%d%d%d",&x,&y,&z);son[x].push_back(y);w[x].push_back(z);son[y].push_back(x);w[y].push_back(z);}dis[1] = 0;dfs(1, 0);int p = 0;for (int s:myset){p++;rep1(i,1,MAXN-1) F[p][i] = -1;F[p][s] = 0;q.clear();q.insert({0,s});while (!q.empty()){pair<LL,int> temp = (*q.begin());q.erase(q.begin());int x = temp.second;LL disx = temp.first;if (F[p][x]<disx) continue;rep1(i,0,(int)son[x].size()-1){int y = son[x][i];LL cost = w[x][i];if (F[p][y]==-1 || F[p][y]>disx+cost){F[p][y] = disx+cost;q.insert({F[p][y],y});}}}}int q;scanf("%d",&q);rep1(i,1,q){int t0, t1;scanf("%d%d",&t0,&t1);long long ans = getMinimalDistance(t0,t1);rep1(j,1,p){if (F[j][t0]!=-1 && F[j][t1]!=-1){ans = min(ans,F[j][t0]+F[j][t1]);}}printf("%lld\n",ans);}}return 0;
}
转载于:https://www.cnblogs.com/AWCXV/p/9960075.html
【 Educational Codeforces Round 51 (Rated for Div. 2) F】The Shortest Statement相关推荐
- 【Educational Codeforces Round 48 (Rated for Div. 2) D】Vasya And The Matrix
[链接] 我是链接,点我呀:) [题意] 告诉你每一行.每一列的异或和. 让你求出一个符合要求的原矩阵. [题解] 显然应该有 a1^a2^....^an = b1^b2^....^bn 也即两边同时 ...
- Educational Codeforces Round 73 (Rated for Div. 2) F. Choose a Square 线段树 + 二维转一维
传送门 文章目录 题意: 思路: 题意: 给你nnn个点(xi,yi)(x_i,y_i)(xi,yi),每个点有个价值cic_ici,现在你可以框一个正方形,要求左下角和右上角的坐标(x,y)( ...
- Educational Codeforces Round 76 (Rated for Div. 2) F. Make Them Similar 折半搜索
传送门 文章目录 题意: 思路: 题意: 思路: 一个显然的思路就是2302^{30}230枚举所有的xxx,让后再检查,这个复杂度显然不能接受. 又发现对于每个位置它取多少不受其他位置限制,满足可拼 ...
- 【Educational Codeforces Round 61 (Rated for Div. 2)】A.B.C.D.E.F.G
前言 这场在最开始很顺利,A题6min1A,B题14min1A,但是由于C题过题人数太少一度认为这个C题很难,等有人过了才开始写最开始的想法,C题40min1A,过C之后发现F过的很多,去看提,发现和 ...
- Educational Codeforces Round 87 (Rated for Div. 2) F. Summoning Minions
题目链接 Polycarp plays a computer game. In this game, the players summon armies of magical minions, whi ...
- Educational Codeforces Round 41 (Rated for Div. 2) F. k-substrings
F. k-substrings time limit per test 4 seconds memory limit per test 256 megabytes input standard inp ...
- Educational Codeforces Round 81 (Rated for Div. 2) F.Good Contest \ 洛谷 划艇 组合 计数dp
cf传送门 P3643 [APIO2016]划艇 文章目录 题意: 思路: 题意: aia_iai在[li,ri][l_i,r_i][li,ri]等概率随机选一个数,求aaa数组不增的概率. 思 ...
- Educational Codeforces Round 101 (Rated for Div. 2) F. Power Sockets 哈希 + 乱搞
传送门 题意: 给一个二进制串aaa,让后定义两个串相似为有至少一个相同位置相等.现在让你找一个字典序最小的长度为kkk的串使其与aaa中每个长度为kkk的字串相似. 思路: 首先我们知道所有可能的串 ...
- 【CF比赛】Educational Codeforces Round 102 (Rated for Div. 2)
题目来源 Educational Codeforces Round 102 (Rated for Div. 2) A. Replacing Elements 只要判断最大值是否小于等于d,或者第一个值 ...
- Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)
Educational Codeforces Round 90 (Rated for Div. 2) Donut Shops 思路 分三种情况: a==c/ba == c / ba==c/b这个时候两 ...
最新文章
- 频频霸榜的Python,竟遭开发者嫌弃!
- 美团面试题:String s = new String(111)会创建几个对象?
- shiro实现url级别的权限控制(用户登录)配置文件分析
- 钱大妈关闭所有北京门店:低估了北京市场的难度
- Kafka : FileNotFoundException索引文件丢失 xxx.index (No such file or directory)
- 领导叫我要好好带新人。。。
- linux服务器的性能分析与优化(十三)
- 五个典型的 JavaScript 面试题
- 路由器手机测试网速的软件,4个实用的无线路由器WiFi检测工具,让你网速又快又稳定...
- 实现一个简单的类似spring的pointcut正则表达式
- JavaScript入门概念
- matlab 复权数据,〖Matlab〗基于通达信股价数据的复权处理(fantuanxiaot版本)
- 数据结构易混点、易错点、题目(个人向)
- PTA 实验7-5 输出大写英文字母(10 分)
- 基于卷积神经网络的多目标图像检测研究(三)
- 手机屏幕投到Windows系统
- docker里面什么emule比较好_推荐 5 款超好用的开源 Docker 工具
- Stata重复与去重
- 在Follow5 开围脖了
- 论文阅读11——《Mutual Boost Network for Attributed Graph Clustering》
热门文章
- 关于Cocos2d-x中使用完Blink动作后精灵突然消失的问题的解决
- linux挂载win下的共享文件
- 使用 JavaScript File API 实现文件上传
- list 转 json,以及 json 解析
- 清华提出:用于细粒度实体分类的Prompt-Learning,并提出可训练Prompt模板
- 【论文解读】基于边界感知神经网络进行嵌套命名实体识别
- 【面试】一些NLP的面试问题
- 马云:旧制造业要凉,贸易战至少得打20年(附演讲全文)
- 【每日算法Day 90】5种方法:求解数组中出现次数超过一半的那个数
- 论文赏析[NAACL19]一个更好更快更强的序列标注成分句法分析器