cf 609E.Minimum spanning tree for each edge
最小生成树,lca(树链剖分(太难搞,不会写))
问存在这条边的最小生成树,2种情况。1.这条边在原始最小生成树上。2.加上这条半形成一个环(加上),那么就找原来这条边2端点间的最大边就好(减去)。(sum+val-max)
(代码冗长)
#include<bits/stdc++.h>
#define LL long long
#define N 100005
using namespace std;
inline int ra()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
struct node{
int x,y,id,v;
}a[N<<];
struct data{
int to,next,v;
}e[N<<];
int n,m,deep[N<<],fa[N<<][];
int father[N<<],cnt;
LL sum;
int mx[N<<][],head[N<<];
bool vis[N<<];
void insert(int x, int y, int v)
{
e[++cnt].next=head[x];
e[cnt].to=y;
e[cnt].v=v;
head[x]=cnt;
}
int find(int x)
{
return father[x]==x?x:father[x]=find(father[x]);
}
bool cmp(node a, node b)
{
return a.v<b.v;
}
bool cmpid(node a, node b)
{
return a.id<b.id;
}
void dfs(int x, int f)
{
for (int i=; i<=; i++)
{
fa[x][i]=fa[fa[x][i-]][i-];
mx[x][i]=max(mx[x][i-],mx[fa[x][i-]][i-]);
}
for (int i=head[x];i;i=e[i].next)
{
if (e[i].to==f) continue;
fa[e[i].to][]=x;
mx[e[i].to][]=e[i].v;
deep[e[i].to]=deep[x]+;
dfs(e[i].to,x);
}
}
int getans(int x, int y)
{
int ans=;
if (deep[x]<deep[y]) swap(x,y);
int t=deep[x]-deep[y];
for (int i=; i<=; i++)
if (t&(<<i)) ans=max(ans,mx[x][i]),x=fa[x][i];
for (int i=; i>=; i--)
if (fa[x][i]!=fa[y][i])
{
ans=max(ans,max(mx[x][i],mx[y][i]));
x=fa[x][i]; y=fa[y][i];
}
if (x!=y) return max(ans,max(mx[x][],mx[y][]));
return ans;
}
int main()
{
n=ra(); m=ra();
for (int i=; i<=m; i++)
{
int x=ra(),y=ra(),v=ra();
a[i].x=x; a[i].y=y; a[i].v=v; a[i].id=i;
}
sort(a+,a+m+,cmp); int tot=;
for (int i=; i<=n; i++) father[i]=i;
for (int i=; i<=m; i++)
{
int q=find(a[i].x),p=find(a[i].y);
if (p!=q)
{
vis[a[i].id]=;
father[p]=q;
sum+=a[i].v;
tot++;
insert(a[i].x,a[i].y,a[i].v);
insert(a[i].y,a[i].x,a[i].v);
// cout<<a[i].x<<" "<<a[i].y<<" "<<a[i].v<<endl;
}
if (tot==n-) break;
}
dfs(,);
sort(a+,a+m+,cmpid);
for (int i=; i<=m; i++)
{
if (vis[i]) printf("%I64d\n",sum);
else {
cout<<sum+(LL)a[i].v-(LL)getans(a[i].x,a[i].y)<<endl;
// cout<<getans(a[i].x,a[i].y);while (1);
}
}
return ;
}
cf 609E.Minimum spanning tree for each edge的更多相关文章
- [Educational Round 3][Codeforces 609E. Minimum spanning tree for each edge]
这题本来是想放在educational round 3的题解里的,但觉得很有意思就单独拿出来写了 题目链接:609E - Minimum spanning tree for each edge 题目大 ...
- 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 ...
- Educational Codeforces Round 3 E (609E) Minimum spanning tree for each edge
题意:一个无向图联通中,求包含每条边的最小生成树的值(无自环,无重边) 分析:求出这个图的最小生成树,用最小生成树上的边建图 对于每条边,不外乎两种情况 1:该边就是最小生成树上的边,那么答案显然 2 ...
- codeforces 609E. Minimum spanning tree for each edge 树链剖分
题目链接 给一个n个节点m条边的树, 每条边有权值, 输出m个数, 每个数代表包含这条边的最小生成树的值. 先将最小生成树求出来, 把树边都标记. 然后对标记的边的两个端点, 我们add(u, v), ...
- 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 ...
- 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 ...
- Codeforces Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA链上最大值
E. Minimum spanning tree for each edge 题目连接: http://www.codeforces.com/contest/609/problem/E Descrip ...
- 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 ...
- 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 ...
随机推荐
- php 实现店铺装修7
type_id=0的情况 type_id=1的情况 type_id=2的情况 /** * @title 店铺装修--商品分类 * @param type ...
- unity3d Asset Store下载的资源在哪?
win7 C:\Users\(用户名)\AppData\Roaming\Unity\Asset Store\ 用户名为中文的时候,是不能直接在unity3d中打开的.
- PHP连数据库生成数据字典
<?php /** * 生成mysql数据字典 */ header("Content-type:text/html;charset=utf-8"); // 配置数据库 $da ...
- Echarts学习宝典
1,可以使用百度图说中的图表代码复制到option中,还可在百度图说中以可视化的方式编辑数据,调整参数和编辑样式.(也可借助百度图说更改部分样式) 2,借助网站 https://echarts.bai ...
- 图片转换到指定大小PDF
1.首先转换为eps jpeg2ps compile to exec file ./jpeg2ps -p a4 a.jpg -o x.eps2.从eps转换到pdf ps2pdf -dDownsa ...
- JDBC Connection Configuration配置正确,提示Error preloading the connection pool
JDBC Connection Configuration配置正确,提示Error preloading the connection pool JDBC 请求报错,提示: 因为之前执行是正确的,这次 ...
- liunx命令用到的
su:切换成root用户 sudo su:普通用户申请root权限 ping命令可以检查linux是否联网 ping www.baidu.com 如图就是联网了 结束ping包括其他linux的指令 ...
- python2.7 操作ceph-cluster S3对象接口 实现: 上传 下载 查询 删除 顺便使用Docker装个owncloud 实现UI管理
python version: python2.7 需要安装得轮子: botofilechunkio command: yum install python-pip&& pip ...
- Windows下使用nginx问题
1.下载完成后,解压缩,运行cmd,使用命令进行操作,不要直接双击nginx.exe,不要直接双击nginx.exe,不要直接双击nginx.exe 一定要在dos窗口启动,不要直接双击nginx.e ...
- firewalld学习--维护命令
启动 systemctl start firewalld 停止 systemctl stop firewalld 重启 systemctl restart firewalld 查询状态 systemc ...