E. Minimum spanning tree for each edge

题目连接:

http://www.codeforces.com/contest/609/problem/E

Description

Connected undirected weighted graph without self-loops and multiple edges is given. Graph contains n vertices and m edges.

For each edge (u, v) find the minimal possible weight of the spanning tree that contains the edge (u, v).

The weight of the spanning tree is the sum of weights of all edges included in spanning tree.

Input

First line contains two integers n and m (1 ≤ n ≤ 2·105, n - 1 ≤ m ≤ 2·105) — the number of vertices and edges in graph.

Each of the next m lines contains three integers ui, vi, wi (1 ≤ ui, vi ≤ n, ui ≠ vi, 1 ≤ wi ≤ 109) — the endpoints of the i-th edge and its weight.

Output

Print m lines. i-th line should contain the minimal possible weight of the spanning tree that contains i-th edge.

The edges are numbered from 1 to m in order of their appearing in input.

Sample Input

5 7

1 2 3

1 3 1

1 4 5

2 3 2

2 5 3

3 4 2

4 5 4

Sample Output

9

8

11

8

8

8

9

Hint

题意

给你一个图,n点m边。对于每个边,问你包含这条边的最小生成树是多少。

题解:

先求最小生成树..查询在树上的边不影响结果,不在树上的边加入会产生环,那么求出这个环上权最大的边,删掉就是包含当前边的最小生成树.这个查询可以用倍增lca做

当然,直接上熟练剖分/LCT也是兹瓷的!

代码

#include<bits/stdc++.h>
using namespace std; const int N=200500;
int n,m;
struct node
{
int x,y,c,no;
}E[N<<1];
int pre[N],to[N<<1],w[N<<1],nxt[N<<1];
int fa[N],lca[N][22],p[N][22],dep[N],cnt;
long long ans[N]; void makeedge(int x,int y,int c)
{
to[cnt]=x;w[cnt]=c;nxt[cnt]=pre[y];pre[y]=cnt++;
to[cnt]=y;w[cnt]=c;nxt[cnt]=pre[x];pre[x]=cnt++;
}
int getfather(int x)
{
if(fa[x]==x) return fa[x];else return fa[x]=getfather(fa[x]);
}
void dfs(int x)
{
for(int it=pre[x];~it;it=nxt[it])
{
int y=to[it],c=w[it];
if(y==lca[x][0]) continue;
dep[y]=dep[x]+1,lca[y][0]=x,p[y][0]=c;
dfs(y);
}
}
int query(int x,int y)
{
int ret=0;
if(dep[x]<dep[y]) swap(x,y);
for(int i=21;i>=0;i--)
if(dep[x]-(1<<i)>=dep[y])
ret=max(ret,p[x][i]),x=lca[x][i];
if(x==y) return ret;
for(int i=21;i>=0;i--)
if(lca[x][i]!=lca[y][i])
ret=max(ret,max(p[x][i],p[y][i])),x=lca[x][i],y=lca[y][i];
ret=max(ret,max(p[y][0],p[x][0]));
return ret;
}
bool cmp(node t1,node t2)
{
return t1.c<t2.c;
} int main()
{
scanf("%d%d",&n,&m);
memset(pre,-1,sizeof(pre));
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&E[i].x,&E[i].y,&E[i].c);
E[i].no=i;
}
sort(E+1,E+m+1,cmp);
long long tot=0;
for(int i=1;i<=m;i++)
{
int x=E[i].x,y=E[i].y;
int f1=getfather(x),f2=getfather(y);
if(f1!=f2)
{
fa[f2]=f1;
tot+=(long long)E[i].c;
makeedge(x,y,E[i].c);
}
}
dfs(1);
for(int j=1;j<=21;j++)
for(int i=1;i<=n;i++)
if(lca[i][j-1])
{
lca[i][j]=lca[lca[i][j-1]][j-1];
p[i][j]=max(p[i][j-1],p[lca[i][j-1]][j-1]);
}
for(int i=1;i<=m;i++)
{
int x=E[i].x,y=E[i].y;
int tt=query(x,y);
ans[E[i].no]=max(0LL,(long long)E[i].c-(long long)tt)+tot;
}
for(int i=1;i<=m;i++)
printf("%I64d\n",ans[i]);
return 0;
}

Codeforces Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA链上最大值的更多相关文章

  1. Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA/(树链剖分+数据结构) + MST

    E. Minimum spanning tree for each edge   Connected undirected weighted graph without self-loops and ...

  2. Codeforces Educational Codeforces Round 3 E. Minimum spanning tree for each edge 树上倍增

    E. Minimum spanning tree for each edge 题目连接: http://www.codeforces.com/contest/609/problem/E Descrip ...

  3. CF# Educational Codeforces Round 3 E. Minimum spanning tree for each edge

    E. Minimum spanning tree for each edge time limit per test 2 seconds memory limit per test 256 megab ...

  4. Educational Codeforces Round 3 E. Minimum spanning tree for each edge 最小生成树+树链剖分+线段树

    E. Minimum spanning tree for each edge time limit per test 2 seconds memory limit per test 256 megab ...

  5. Educational Codeforces Round 3 E. Minimum spanning tree for each edge (最小生成树+树链剖分)

    题目链接:http://codeforces.com/contest/609/problem/E 给你n个点,m条边. 问枚举每条边,问你加这条边的前提下组成生成树的权值最小的树的权值和是多少. 先求 ...

  6. CF Educational Codeforces Round 3 E. Minimum spanning tree for each edge 最小生成树变种

    题目链接:http://codeforces.com/problemset/problem/609/E 大致就是有一棵树,对于每一条边,询问包含这条边,最小的一个生成树的权值. 做法就是先求一次最小生 ...

  7. codeforces 609E. Minimum spanning tree for each edge 树链剖分

    题目链接 给一个n个节点m条边的树, 每条边有权值, 输出m个数, 每个数代表包含这条边的最小生成树的值. 先将最小生成树求出来, 把树边都标记. 然后对标记的边的两个端点, 我们add(u, v), ...

  8. [Educational Round 3][Codeforces 609E. Minimum spanning tree for each edge]

    这题本来是想放在educational round 3的题解里的,但觉得很有意思就单独拿出来写了 题目链接:609E - Minimum spanning tree for each edge 题目大 ...

  9. codeforces 609E Minimum spanning tree for each edge

    E. Minimum spanning tree for each edge time limit per test 2 seconds memory limit per test 256 megab ...

随机推荐

  1. webtest 文章

    一直也没有和游戏类测试打过交道,看到“腾讯WeTest ”提供的测试服务,以及和手机游戏相关的技术文章.在此作个备份记录的. 手游专题 http://wetest.qq.com/lab/tag/?ta ...

  2. Aptana 插件 for Eclipse 4.4

    http://download.aptana.com/studio3/plugin/install Aptana Update Site This site is designed to be use ...

  3. IOS-多视图控制器之间的切换

    1. 创建个单视图应用程序 2. 在向Main.storyboard中拖一个ViewController控制器 3. 在第一个viewController中添加一个按钮 4. 按着control键,推 ...

  4. Asp.net MVC4 使用EF实现数据库的增删改查

    EF的使用 步骤: (1)将EF添加到项目:在Model右击添加新建项 找到ADO.NET实体数据模型,接着... (2)实现数据库的增删改查       查询 (因为在Model中已经添加EF实体了 ...

  5. 不定高度的div背景或背景图片不显示问题

    在使用div+css进行网页布局时,如果外部div有背景颜色或者边框,而不设置其高度,在IE浏览器下显示正常.但是使用Firefox/opera浏览时却出现最外层Div的背景颜色和边框不起作用的问题. ...

  6. IOS 异步加载图片

    #import <Foundation/Foundation.h> #import "StringUtils.h" @interface ImageManager : ...

  7. html5 canvas图片翻转

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. POJ 2318 TOYS (计算几何,叉积判断)

    TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8661   Accepted: 4114 Description ...

  9. 下拉框QComboBox相关函数

    QComboBox addItem (self, QString text, QVariant userData = QVariant())addItem (self, QIcon icon, QSt ...

  10. 【Linux笔记】Linux目录结构

    [Linux笔记]Linux目录结构   本文内容整理自网络,以作参考. /:根目录,位于linux文件系统目录结构的顶层,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib ...