233333想简单了。。。。

题解参见http://hzwer.com/3710.html

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 4050
#define maxe 200500
#define inf 0x7f7f7f7f7f7f7f7fLL
using namespace std;
struct edge
{
long long u,v,w,flag,nxt;
}e[maxe];
long long n,m,x,y,a,b,g[maxv],nume=,dis[maxv];
long long top[maxv],fath[maxv],dfn[maxv],dep[maxv],size[maxv],son[maxv],times=;
long long root,tot=,ls[maxv<<],rs[maxv<<],lazy[maxv<<];
void addedge(long long u,long long v,long long w,long long flag)
{
e[++nume].u=u;
e[nume].v=v;
e[nume].w=w;
e[nume].flag=flag;
e[nume].nxt=g[u];
g[u]=nume;
}
void dfs1(long long x)
{
size[x]=;son[x]=;
for (long long i=g[x];i;i=e[i].nxt)
{
long long v=e[i].v;
if ((e[i].flag) && (v!=fath[x]))
{
fath[v]=x;dep[v]=dep[x]+;dis[v]=dis[x]+e[i].w;
dfs1(v);
size[x]+=size[v];
if (size[v]>size[son[x]]) son[x]=v;
}
}
}
void dfs2(long long x,long long father)
{
dfn[x]=++times;top[x]=father;
if (son[x]) dfs2(son[x],father);
for (long long i=g[x];i;i=e[i].nxt)
{
long long v=e[i].v;
if ((e[i].flag) && (v!=fath[x]) && (v!=son[x]))
dfs2(v,v);
}
}
void build(long long &now,long long left,long long right)
{
now=++tot;lazy[now]=inf;
if (left==right) return;
long long mid=(left+right)>>;
build(ls[now],left,mid);
build(rs[now],mid+,right);
}
void modify(long long now,long long left,long long right,long long l,long long r,long long x)
{
if ((left==l) && (right==r))
{
lazy[now]=min(lazy[now],x);
return;
}
long long mid=(left+right)>>;
if (r<=mid) modify(ls[now],left,mid,l,r,x);
else if (l>=mid+) modify(rs[now],mid+,right,l,r,x);
else {modify(ls[now],left,mid,l,mid,x);modify(rs[now],mid+,right,mid+,r,x);}
}
long long lca(long long u,long long v)
{
long long f1=top[u],f2=top[v];
while (f1!=f2)
{
if (dep[f1]<dep[f2]) {swap(f1,f2);swap(u,v);}
u=fath[f1];f1=top[u];
}
if (dep[u]<dep[v]) return u;
else return v;
}
void work(long long x)
{
long long u=e[x].u,v=e[x].v,ret=dis[u]+e[x].w+dis[v];
long long t=lca(u,v);
if (t==v) return;
u=t;
long long f1=top[u],f2=top[v];
while (f1!=f2)
{
if (dep[f1]<dep[f2]) {swap(f1,f2);swap(u,v);}
modify(root,,n,dfn[f1],dfn[u],ret);
u=fath[f1];f1=top[u];
}
if (u!=v)
{
if (dep[u]>dep[v]) swap(u,v);
modify(root,,n,dfn[u]+,dfn[v],ret);
}
}
long long ask(long long now,long long left,long long right,long long pos)
{
if (left==right)
return lazy[now];
long long mid=(left+right)>>;
if (pos<=mid) return min(ask(ls[now],left,mid,pos),lazy[now]);
else return min(ask(rs[now],mid+,right,pos),lazy[now]);
}
int main()
{
scanf("%lld%lld",&n,&m);
for (long long i=;i<=m;i++)
{
scanf("%lld%lld%lld%lld",&x,&y,&a,&b);
addedge(x,y,a,b);
addedge(y,x,a,b);
}
dfs1();
dfs2(,);
build(root,,n);
for (long long i=;i<=nume;i++)
{
long long u=e[i].u,v=e[i].v,ret=dis[u]+e[i].w+dis[v];
if (e[i].flag) continue;
work(i);
}
for (long long i=;i<=n;i++)
{
long long ret=ask(root,,n,dfn[i]);
if (ret==inf) printf("-1 ");
else printf("%lld ",ret-dis[i]);
}
printf("\n");
return ;
}

BZOJ 3694 最短路的更多相关文章

  1. Bzoj 3694: 最短路 树链剖分

    3694: 最短路 Time Limit: 5 Sec  Memory Limit: 256 MBSubmit: 67  Solved: 34[Submit][Status][Discuss] Des ...

  2. BZOJ 3694&&DTOJ 1972: 最短路

    题目描述 给出一个n个点m条边的无向图,n个点的编号从1~n,定义源点为1.定义最短路树如下:从源点1经过边集T到任意一点i有且仅有一条路径,且这条路径是整个图1到i的最短路径,边集T构成最短路树. ...

  3. BZOJ 3040 最短路 (堆优化dijkstra)

    这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...

  4. BZOJ 3040: 最短路(road) ( 最短路 )

    本来想学一下配对堆的...结果学着学着就偏了... 之前 kpm 写过这道题 , 前面的边不理它都能 AC .. 我也懒得去写前面的加边了... 用 C++ pb_ds 库里的 pairing_hea ...

  5. BZOJ 3040: 最短路(road) [Dijkstra + pb_ds]

    3040: 最短路(road) Time Limit: 60 Sec  Memory Limit: 200 MBSubmit: 2476  Solved: 814[Submit][Status][Di ...

  6. 【刷题】BZOJ 2125 最短路

    Description 给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径. Input 输入的第一行包含三个整数,分别表示N和M和Q 下接M行,每行三个 ...

  7. BZOJ 2125: 最短路

    2125: 最短路 Time Limit: 1 Sec  Memory Limit: 259 MBSubmit: 756  Solved: 331[Submit][Status][Discuss] D ...

  8. BZOJ.2125.最短路(仙人掌 最短路Dijkstra)

    题目链接 多次询问求仙人掌上两点间的最短路径. 如果是在树上,那么求LCA就可以了. 先做着,看看能不能把它弄成树. 把仙人掌看作一个图(实际上就是),求一遍根节点到每个点的最短路dis[i]. 对于 ...

  9. BZOJ 3040最短路

    题目描述 给定一个 NN 个点, MM 条有向边的带权图,请你计算从 SS 出发,到每个点的距离. 数据保证你能从 SS 出发到任意点. 输入输出格式 输入格式: 第一行两个整数 NN . MM ,表 ...

随机推荐

  1. MEAN实践——LAMP的新时代替代方案(下)

    在本系列文章的第一部分旨在介绍一些应用程序的基础技术细节和如何进行数据建模,而这个部分文章将着手建立验证应用程序行为的测试,并会指出如何启动和运行应用程序. 首先,编写测试 首先定义一些小型配置库.文 ...

  2. POJ 1236

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10500   Accepted: 41 ...

  3. POJ 2007 Scrambled Polygon (简单极角排序)

    题目链接 题意 : 对输入的点极角排序 思路 : 极角排序方法 #include <iostream> #include <cmath> #include <stdio. ...

  4. java获取系统当前时间

    SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置日期格式 System.out.print(df. ...

  5. C#中毫米与像素的换算方法

    C#中以像素作为尺寸单位,像素是一种相对的尺寸概念,与毫米的转换与当前显示器的分辨率有关.在不同分辨率下转换的系数不同. 借助GDI可以完成毫米至像素的转换. public static double ...

  6. lintcode:买卖股票的最佳时机 III

    买卖股票的最佳时机 III 假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格.设计一个算法来找到最大的利润.你最多可以完成两笔交易. 样例 给出一个样例数组 [4,4,6,1,1,4,2 ...

  7. 实现Web上的用户登录功能

    关于如何实现web上的自动登录功能 文章来源http://coolshell.cn/articles/5353.html Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能 ...

  8. C++运算符重载——重载二元运算符

    1.重载二元操作符的方法 二元运算符又称为双目运算符,即需要2个操作数的运算符,例如 + - * / 等. 运算符重载可以分为3种方式:类的非静态成员函数.类的友元函数.普通函数. 例如有 2 个操作 ...

  9. 看完这些,你就算得上既了解围棋又了解alphago了

    首先,我们要祝贺小李下出第78手的“神之一手”,这一手堪称前无古人后无来者,尤其是结合了阿尔法狗自暴自弃的表现.小李说过他的失败并不是人类的失败,同样,小李的胜利也只是属于他一人的胜利. 然而人类在围 ...

  10. 【ArcEngine入门与提高】Element(元素)、Annotation(注记)旋转

    因项目需要,需要做一个旋转注记的工具.因为注记这玩意用的比较少,网上资源也很少,所以做起来相当头疼.在经过一番研究之后,终于搞清楚注记的存储原理了,原来是和Element的类似,只不过注记是要把Ele ...