cf测评姬比uva快了五倍。。。

/*
不管这条边是不是在mst上,直接跑lca求出路径上的最大边w即可
ans=mst-w+dist(u,v)
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 100007
struct Edge{int to,nxt,w;}edge[maxn<<];
struct E{int u,v,w,flag;}e[maxn<<];
int cmp(E a,E b){return a.w<b.w;}
int head[maxn],tot,n,m,q;
map<int,int>mp[maxn];
/*4 5 2 1 3*/
void addedge(int u,int v,int w){
edge[tot].w=w;
edge[tot].to=v;
edge[tot].nxt=head[u];
head[u]=tot++;
}
int F[maxn];
int find(int x){
return F[x]==-?x:F[x]=find(F[x]);
}
int kruskal(){
memset(F,-,sizeof F);
sort(e+,e++m,cmp);
int cnt=,res=;
for(int i=;i<=m;i++){
int f1=find(e[i].u),f2=find(e[i].v);
if(f1==f2)continue;
addedge(e[i].u,e[i].v,e[i].w);
addedge(e[i].v,e[i].u,e[i].w);
res+=e[i].w;
F[f1]=f2;
if(++cnt==n)break;
}
return res;
} int d[maxn],f[maxn][],dp[maxn][];
void bfs(){
memset(d,,sizeof d);
memset(f,,sizeof f);
memset(dp,,sizeof dp);
queue<int>q;
q.push();
d[]=;
while(!q.empty()){
int x=q.front();q.pop();
for(int i=head[x];i!=-;i=edge[i].nxt){
int y=edge[i].to;
if(d[y])continue;
d[y]=d[x]+;
f[y][]=x;
dp[y][]=edge[i].w;
for(int k=;k<=;k++){
f[y][k]=f[f[y][k-]][k-];
dp[y][k]=max(dp[y][k-],dp[f[y][k-]][k-]);
}
q.push(y);
}
}
}
int lca(int x,int y){//返回路径上的最大边
int res=;
if(d[x]<d[y])swap(x,y);
for(int i=;i>=;i--)
if(d[f[x][i]]>=d[y]){
res=max(res,dp[x][i]);
x=f[x][i];
}
if(x==y)return res;
for(int i=;i>=;i--)
if(f[x][i]!=f[y][i]){
res=max(res,max(dp[x][i],dp[y][i]));
x=f[x][i],y=f[y][i];
}
res=max(res,max(dp[x][],dp[y][]));
return res;
} void init(){
memset(head,-,sizeof head);
memset(e,,sizeof e);
memset(edge,,sizeof edge);
for(int i=;i<=n;i++)mp[i].clear();
tot=;
}
int main(){
while(scanf("%d%d",&n,&m)==){
init();
for(int i=;i<=m;i++){
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
mp[e[i].u][e[i].v]=mp[e[i].v][e[i].u]=e[i].w;
}
int mst=kruskal();
bfs();
scanf("%d",&q);
while(q--){
int u,v;
scanf("%d%d",&u,&v); cout<<mst-lca(u,v)+mp[u][v]<<endl;
}
}
}

Imperial roads 非严格次小生成树的更多相关文章

  1. XJOI 3629 非严格次小生成树(pqq的礼物)

    题目描述: 有一天,pqq准备去给×i×准备礼物,他有一些礼品准备包装一下,他用线将这些礼物连在一起,不同的礼物因为风格不同所以连接它们需要不同价值的线.风格差异越大,价格越大(所以两个礼物之间只有一 ...

  2. (luogu4180) [Beijing2010组队]次小生成树Tree

    严格次小生成树 首先看看如果不严格我们怎么办. 非严格次小生成树怎么做 由此,我们发现一个结论,求非严格次小生成树,只需要先用kruskal算法求得最小生成树,然后暴力枚举非树边,替换路径最大边即可. ...

  3. 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

  4. 严格次小生成树(Bzoj1977:[Beijing2010组队]次小生成树)

    非严格次小生成树 很简单,先做最小生成树 然后枚举没加入的边加入,替换掉这个环内最大的边 最后取\(min\) 严格次小生成树 还是一样的 可以考虑维护一个严格次大值 最大值和枚举的边相同就替换次大值 ...

  5. P4180 严格次小生成树[BJWC2010] Kruskal,倍增

    题目链接\(Click\) \(Here\). 题意就是要求一个图的严格次小生成树.以前被题面吓到了没敢做,写了一下发现并不难. 既然要考虑次小我们就先考虑最小.可以感性理解到一定有一种次小生成树,可 ...

  6. 算法笔记--次小生成树 && 次短路 && k 短路

    1.次小生成树 非严格次小生成树:边权和小于等于最小生成树的边权和 严格次小生成树:    边权和小于最小生成树的边权和 算法:先建好最小生成树,然后对于每条不在最小生成树上的边(u,v,w)如果我们 ...

  7. 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

  8. 【luogu P4180 严格次小生成树[BJWC2010]】 模板

    题目链接:https://www.luogu.org/problemnew/show/P4180 这个题卡树剖.记得开O2. 这个题inf要到1e18. 定理:次小生成树和最小生成树差距只有在一条边上 ...

  9. BZOJ 1977 严格次小生成树

    小C最近学了很多最小生成树的算法,Prim算法.Kurskal算法.消圈算法等等.正当小C洋洋得意之时,小P又来泼小C冷水了.小P说,让小C求出一个无向图的次小生成树,而且这个次小生成树还得是严格次小 ...

随机推荐

  1. linux 共享内存的理解

    1.  共享内存是在shmget时创建出来的, 在 shmget(USER_SHARE_MEM_KEY,  sizeof(ADDR_NODE) , IPC_CREAT|0666)) ==-1) 的 s ...

  2. Django REST framework 简介

    需求 REST framework需要如下: Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6) Django (1.10, 1.11, 2.0) 下面的文件包可以选择性安装 ...

  3. JAVA知识笔记

    1.对于volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的.更详细介绍参考http://blog.csdn.net/libing13820393394/articl ...

  4. debian 9 安装 teamviewer 13

    1. 官网下载 https://www.teamviewer.com/zhcn/download/linux/ 2.安装 sudo dpkg -i teamviewer_13.0.5693_amd64 ...

  5. vue中过滤器filters的使用

    组件内写法 filters:{ filter:function(data,arg1,arg2){ return .... } } 全局写法 filters('filter',function(data ...

  6. 【转】Python 3的pathlib模块:驯服文件系统

    [转]Python 3的pathlib模块:驯服文件系统 https://python.freelycode.com/contribution/detail/1248 Python部落(python. ...

  7. curl的http上传文件代码

    int http_post_file(const char *url, const char *user, const char *pwd, const char *filename){    ass ...

  8. 【Boost】boost::tokenizer详解

    分类: [C++]--[Boost]2012-12-28 21:42 2343人阅读 评论(0) 收藏 举报   目录(?)[+]   tokenizer 库提供预定义好的四个分词对象, 其中char ...

  9. boost.log在项目中应用

    //头文件#pragma once #include <string> #include <boost/log/trivial.hpp> using std::string; ...

  10. Unity3D动态生成多边形

    来自https://blog.csdn.net/qq_14903317/article/details/69668521 自由绘制多边形   https://blog.csdn.net/lei_710 ...