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 扩展根分区

    参考链接:  http://blog.51cto.com/lubcdc/1763133

  2. call,apply和bind的区别

    call,apply继承并调用该函数,bind继承后未调用函数. var React = require('react'); //核心 var ReactDom = require('react-do ...

  3. ASP.NET MVC - 发布web应用程序、部署到IIS

    发布项目 右击项目 - 发布 选择IIS - 点击发布 发布方法 - 文件系统,目标位置 - 选择与项目所在目录不同的目录(也即,指定一个发布生成文件的目录),文件发布选项 - 不选 - 点击发布 安 ...

  4. shell编程 之 echo命令和printf命令

    1 echo命令基本情况: echo显示普通字符:echo "i am studying shell"(有木有引号都可以) 支持转义字符:echo "\"hel ...

  5. C# 事务 四种事务隔离级别

    http://www.zsythink.net/archives/1233 不同隔离级别的问题   脏读(Dirty Read) 一个事务处理过程里读取了另一个未提交的事务中的数据 例子: 当一个事务 ...

  6. VS code 配置C++编译环境

    主要参考链接:https://blog.csdn.net/bat67/article/details/76095813 另外有如下几处需要注意的地方: (1) 这部需要提前“run build tas ...

  7. Go语言中的map

    map是一个集合,可以使用类似处理数组和切片的方式迭代map中的元素.但map是无序的集合.无序的原因是map的实现使用了散列表. map的创建并初始化主要是两种方式: 1.内置的make函数 2.使 ...

  8. shell脚本 统计一段程序运行时间【转】

    转自:https://bbs.csdn.net/topics/391943383#include <stdio.h> #include <stdlib.h> #include ...

  9. Linux的notifier机制在TP中的应用【转】

    转自:https://blog.csdn.net/armfpga123/article/details/51771666 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...

  10. async_retrying

    from async_retrying import retry import aiohttp import asyncio @retry(attempts=6) async def fetch(): ...