codeforce 240E
/*
最小树形图+保存路径
第一次想错了,各种wa,tle后网上看资料,找到一篇错误的题解。。。
最后用对着正解分析了一波,感觉对最小树形图又有了新的理解:最小树形图的精髓在于每张图更新的时间信息!
第一次感觉到如此神奇的算法,解释分散在注释里了
pass:交到cf上时加文件输入输出语句才能过
*/
/*
cf240e
最小树形图:输出路径板子
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 100005
#define MAXM 2000005
#define ll long long
#define INF 0x7fffffff
using namespace std;
int pre[MAXN],vis[MAXN],in[MAXN],id[MAXN];
int usedEdge[MAXN],preEdge[MAXN];
struct Edge{
int u,v,w,ww,id;
Edge(){}
Edge(int uu,int vv,int _w,int _ww,int ii):u(uu),v(vv),w(_w),ww(_ww),id(ii){}
}edge[MAXM];
struct Used{
int pre,id;
}cancle[MAXM];//保留每次更新图时被取消的边id
int zhuliu(int root,int n,int m){
memset(usedEdge,,sizeof usedEdge);
int total=m,res=;
int u,v,w;
while(){
for(int i=;i<n;i++)in[i]=INF;
for(int i=;i<m;i++){
u=edge[i].u,v=edge[i].v,w=edge[i].w;
if(u!=v && w<in[v]){
in[v]=w;
pre[v]=u;
//记录这个顶点所在边的编号 !!!
preEdge[v]=edge[i].id;
}
}
for(int i=;i<n;i++)
if (i!=root && in[i]==INF) return -; int tn=;
memset(id,-,sizeof id);
memset(vis,-,sizeof vis);
in[root]=;
for(int i=;i<n;i++){
res+=in[i];
v=i;
//这条边被加入到当前图集合E中,这个点所在的边使用次数+1 !!!!
if(i!=root) usedEdge[preEdge[i]]++;
while(v!=root && id[v]==- && vis[v]!=i){
vis[v]=i;
v=pre[v];
}
if(id[v]==- && v!=root){
for(u=pre[v];u!=v;u=pre[u])
id[u]=tn;
id[v]=tn++;
}
}
if(tn==) break;
for(int i=;i<n;i++)
if(id[i]==-) id[i]=tn++; //准备更新旧图
for(int i=;i<m;i++){
u=edge[i].u,v=edge[i].v;
edge[i].u=id[u],edge[i].v=id[v];
if(id[u]!=id[v]){
edge[i].w-=in[v];
//将该边在旧图中的编号取消
cancle[total].id=edge[i].id;
cancle[total].pre=preEdge[v];
///将这条边id重新编号
edge[i].id=total++;
}
}
n=tn;
root=id[root];
}
//统计新建立(被重新编号)的边 !!!因为每重新编号一条边,就说明有一条边被取消一次,一因此需要将那条变得增加量也取消
//为什么要倒着往回遍历?因为必须沿着最终形成图的状态回溯逐步回溯到原图,找到边原始的id
//肯定是新建立的边导致了之前的边被取消掉,
for(int i=total-;i>=m;i--)
if(usedEdge[i]){//如果这条边被使用过(如果一条边仅仅是被重新编号而未被使用过,即只参与了边权值的改变但没有真正加入到某一次循环图中去,那么和其相关的边不用被取消)
usedEdge[cancle[i].id]++;//
usedEdge[cancle[i].pre]--;//把之前加的减掉
}
return res;
} int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
for(int i=;i<m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
u--;v--;
edge[i]=Edge(u,v,w,w,i);
}
int root=;
int ans=zhuliu(root,n,m);
if(ans==- || ans==)
printf("%d\n",ans);
else {
printf("%d\n",ans);
for(int i=;i<m;i++)
if(edge[i].ww== && usedEdge[i])
printf("%d ",i+);
printf("\n");
}
}
return ;
}
codeforce 240E的更多相关文章
- codeforce 240E 最小树形图+路径记录更新
最小树形图的路径是在不断建立新图的过程中更新的,因此需要开一个结构体cancle记录那些被更新的边,保存可能会被取消的边和边在旧图中的id 在朱刘算法最后添加了一个从后往前遍历新建边的循环,这可以理解 ...
- Codeforce - Street Lamps
Bahosain is walking in a street of N blocks. Each block is either empty or has one lamp. If there is ...
- Codeforce Round #216 Div2
e,还是写一下这次的codeforce吧...庆祝这个月的开始,看自己有能,b到什么样! cf的第二题,脑抽的交了错两次后过了pretest然后system的挂了..脑子里还有自己要挂的感觉,果然回头 ...
- Codeforce 水题报告(2)
又水了一发Codeforce ,这次继续发发题解顺便给自己PKUSC攒攒人品吧 CodeForces 438C:The Child and Polygon: 描述:给出一个多边形,求三角剖分的方案数( ...
- codeforce 375_2_b_c
codeforce 375_2 标签: 水题 好久没有打代码,竟然一场比赛两次卡在边界条件上....跪 b.题意很简单...纯模拟就可以了,开始忘记了当字符串结束的时候也要更新两个值,所以就错了 #i ...
- codeforce 367dev2_c dp
codeforce 367dev2_c dp 标签: dp 题意: 你可以通过反转任意字符串,使得所给的所有字符串排列顺序为字典序,每次反转都有一定的代价,问你最小的代价 题解:水水的dp...仔细想 ...
- 三维dp&codeforce 369_2_C
三维dp&codeforce 369_2_C 标签: dp codeforce 369_2_C 题意: 一排树,初始的时候有的有颜色,有的没有颜色,现在给没有颜色的树染色,给出n课树,用m种燃 ...
- 强连通分量&hdu_1269&Codeforce 369D
强连通分量 标签: 图论 算法介绍 还记得割点割边算法吗.回顾一下,tarjan算法,dfs过程中记录当前点的时间戳,并通过它的子节点的low值更新它的low,low值是这个点不通过它的父亲节点最远可 ...
- 【树状数组】区间出现偶数次数的异或和(区间不同数的异或和)@ codeforce 703 D
[树状数组]区间出现偶数次数的异或和(区间不同数的异或和)@ codeforce 703 D PROBLEM 题目描述 初始给定n个卡片拍成一排,其中第i个卡片上的数为x[i]. 有q个询问,每次询问 ...
随机推荐
- 【tmos】如何在Interceptor拦截器中注入其他数据
光是这样是获取不到weixinConfig内容的 public class WebLoginInterceptor implements HandlerInterceptor { @Autowired ...
- python(六)列表推导式、字典推导式、集合推导式
转载 https://www.cnblogs.com/tkqasn/p/5977653.html
- linux 用户管理命令
- 创建 Pull Request
Pull Request 是开发者使用 GitHub 进行协作的利器.这个功能为用户提供了友好的页面,让提议的更改在并入官方项目之前,可以得到充分的讨论. 最简单地来说,Pull Request 是一 ...
- 通用redis命令
Redis五种数据类型,String,hash,list,set,有序set keys pattern:获取所有与pattern匹配的key,返回所有与该key匹配的keys. 通配符: *表示任意0 ...
- 必须要学会webpack打包,并到特别精通的程度
必须要学会webpack打包,并到特别精通的程度
- aiojobs
import asyncio import aiojobs async def coro(timeout): print(timeout) await asyncio.sleep(timeout) p ...
- 码云 Git No network connection
背景 git,好久没用了都.心血来潮还是赶紧熟悉下吧.果不其然,每次要熟悉或开始一个东西,立马就出现问题.本来好好的环境竟然不行了,搞定后感觉应该是换了网络环境的事.这倒次要,主要让我想起了最初学习g ...
- button 去掉原生边框
button按钮触发 hover 时,自带边框会显示,尤其是 button 设置圆角时,如图: 解决办法: outline: 0;
- selenium——表单嵌套
<html> <iframe id="id-iframe" name="iframee1"> --切换表单 <html> & ...