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. mysql 开源 ~ canal+otter系列(2)

    一 创建相应用户    源数据用户权限: GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO `retl`@'%';    目的 ...

  2. mysql 案例 ~ 常见案例汇总

    一 简介:这里汇总了一些mysql常见的问题二 案例场景   问题1 mysql设置了默认慢日志记录1S,为何会记录不超过1S的sql语句   答案 mysql~log_queries_not_usi ...

  3. ListBox滚动条 刷新列表之后 指定位置(置顶或滚动到最后)

    参数ObservableCollection<T>类型 滚动条在最上 ListBox.ScrollIntoView(ListBoxOC[0]);滚动条在最下 ListBox.ScrollI ...

  4. Boost 序列化

    原文链接: https://blog.csdn.net/qq2399431200/article/details/45621921 1. 编译器 gcc, boost 1.55 2.1第一个简单的例子 ...

  5. shiro登录验证原理

    这段时间有点忙,没咋写博客,今天打开staruml看到以前画的一张shiro原理图,先在这发一下,空了再好好进行分析.

  6. CORS(Cross-origin resource sharing) “跨域资源共享”

    CORS与JSONP的比较 在出现CORS标准之前, 我们还只能通过jsonp的形式去向“跨源”服务器去发送 XMLHttpRequest 请求,这种方式吃力不讨好,在请求方与接收方都需要做处理,而且 ...

  7. Linux查看所有用户和组信息

    主要通过以下两个命令: cat /etc/passwd cat /etc/group 步骤一:cat /etc/passwd查看所有的用户信息,详情如下图: 步骤2:cat /etc/passwd|g ...

  8. 前端 ---jQuery的补充

    15-jQuery补充   jquery内容补充 jquery除了咱们上面讲解的常用知识点之外,还有jquery 插件.jqueryUI知识点 jqueryUI 官网: https://jqueryu ...

  9. 将list集合转json

    public static class DataHelper { /// /// js 序列化器 /// static JavaScriptSerializer jss = new JavaScrip ...

  10. 获取ScrollView ListView的当前位置的百分比

    找不到官方的API,就自己写了一下,下面是自己写的函数 --获取滚动层当前位置的百分比 function GetScrollViewPercent(scrollView) if scrollView ...