【链接】 我是链接,点我呀:)
【题意】

【题解】

先处理出来任意一棵树。
然后把不是树上的边处理出来
对于每一条非树边的点(最多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相关推荐

  1. 【Educational Codeforces Round 48 (Rated for Div. 2) D】Vasya And The Matrix

    [链接] 我是链接,点我呀:) [题意] 告诉你每一行.每一列的异或和. 让你求出一个符合要求的原矩阵. [题解] 显然应该有 a1^a2^....^an = b1^b2^....^bn 也即两边同时 ...

  2. 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)( ...

  3. Educational Codeforces Round 76 (Rated for Div. 2) F. Make Them Similar 折半搜索

    传送门 文章目录 题意: 思路: 题意: 思路: 一个显然的思路就是2302^{30}230枚举所有的xxx,让后再检查,这个复杂度显然不能接受. 又发现对于每个位置它取多少不受其他位置限制,满足可拼 ...

  4. 【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过的很多,去看提,发现和 ...

  5. 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 ...

  6. 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 ...

  7. 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数组不增的概率. 思 ...

  8. Educational Codeforces Round 101 (Rated for Div. 2) F. Power Sockets 哈希 + 乱搞

    传送门 题意: 给一个二进制串aaa,让后定义两个串相似为有至少一个相同位置相等.现在让你找一个字典序最小的长度为kkk的串使其与aaa中每个长度为kkk的字串相似. 思路: 首先我们知道所有可能的串 ...

  9. 【CF比赛】Educational Codeforces Round 102 (Rated for Div. 2)

    题目来源 Educational Codeforces Round 102 (Rated for Div. 2) A. Replacing Elements 只要判断最大值是否小于等于d,或者第一个值 ...

  10. 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这个时候两 ...

最新文章

  1. 频频霸榜的Python,竟遭开发者嫌弃!
  2. 美团面试题:String s = new String(111)会创建几个对象?
  3. shiro实现url级别的权限控制(用户登录)配置文件分析
  4. 钱大妈关闭所有北京门店:低估了北京市场的难度
  5. Kafka : FileNotFoundException索引文件丢失 xxx.index (No such file or directory)
  6. 领导叫我要好好带新人。。。
  7. linux服务器的性能分析与优化(十三)
  8. 五个典型的 JavaScript 面试题
  9. 路由器手机测试网速的软件,4个实用的无线路由器WiFi检测工具,让你网速又快又稳定...
  10. 实现一个简单的类似spring的pointcut正则表达式
  11. JavaScript入门概念
  12. matlab 复权数据,〖Matlab〗基于通达信股价数据的复权处理(fantuanxiaot版本)
  13. 数据结构易混点、易错点、题目(个人向)
  14. PTA 实验7-5 输出大写英文字母(10 分)
  15. 基于卷积神经网络的多目标图像检测研究(三)
  16. 手机屏幕投到Windows系统
  17. docker里面什么emule比较好_推荐 5 款超好用的开源 Docker 工具
  18. Stata重复与去重
  19. 在Follow5 开围脖了
  20. 论文阅读11——《Mutual Boost Network for Attributed Graph Clustering》

热门文章

  1. 关于Cocos2d-x中使用完Blink动作后精灵突然消失的问题的解决
  2. linux挂载win下的共享文件
  3. 使用 JavaScript File API 实现文件上传
  4. list 转 json,以及 json 解析
  5. 清华提出:用于细粒度实体分类的Prompt-Learning,并提出可训练Prompt模板
  6. 【论文解读】基于边界感知神经网络进行嵌套命名实体识别
  7. 【面试】一些NLP的面试问题
  8. 马云:旧制造业要凉,贸易战至少得打20年(附演讲全文)
  9. 【每日算法Day 90】5种方法:求解数组中出现次数超过一半的那个数
  10. 论文赏析[NAACL19]一个更好更快更强的序列标注成分句法分析器