https://www.lydsy.com/JudgeOnline/problem.php?id=4289

https://www.cnblogs.com/clrs97/p/5046933.html  claris的题解很清晰

如果单纯把无向边拆成有向边然后变成点再连有向边需要建m^2条边。

那么这里可以差分建图压缩新图边的数量,把原图每个点的出边和入边排序,权值相同的出边到入边(开始是无向图所以每个出边一定有权值相同的入边,入边也是)连一条权值为相同权值的边。

(从小到大排序后)每条出边往它的前一条边连一条权值为0的边,向后一条边连一条权值为 (后一条边权值)-(当前边权值) 的边。

最后设置一个总入点和总出点相应连1的出边和n的入边就可以了。

合理性就不再说了。

空间要注意,这道题空间开小了wa开大了tle。卡了半天......

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
#define LL long long
#define pa pair<LL,int>
const int maxn=;
int n,m;
struct node{ int x,y;LL v; }a[maxn*],b[maxn*];int cnt=;
struct nod1{ int y,z,next; }e1[maxn*];
struct nod{ int y,next;LL v;}e[maxn*];
int head1[maxn]={},head[maxn*]={},tot1=,tot=;
priority_queue< pa ,vector< pa > , greater< pa > >q;
int S,T; LL dis[maxn*]={};
inline void init1(int x,int y,int z){e1[++tot1].y=y;e1[tot1].z=z;e1[tot1].next=head1[x];head1[x]=tot1;}
inline void init(int x,int y,LL v){e[++tot].y=y;e[tot].v=v;e[tot].next=head[x];head[x]=tot;}
bool mcmp(node aa,node bb){return aa.v<bb.v;}
void Dij(){
memset(dis,,sizeof(dis));
dis[S]=;q.push(make_pair(dis[S],S));
while(!q.empty()){
LL v=q.top().first;int x=q.top().second;q.pop();
if(v>dis[x])continue;
for(int i=head[x];i;i=e[i].next){
if(dis[e[i].y]>dis[x]+e[i].v){
dis[e[i].y]=dis[x]+e[i].v;
q.push(make_pair(dis[e[i].y],e[i].y));
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
int x,y;LL z;
for(int i=;i<=m;i++){
scanf("%d%d%lld",&x,&y,&z);
a[++cnt].x=x;a[cnt].y=y;a[cnt].v=z;
a[++cnt].x=y;a[cnt].y=x;a[cnt].v=z;
init1(x,cnt,cnt-);init1(y,cnt-,cnt);//入边 出边
}
S=cnt+;T=S+;
for(int i=;i<=n;i++){
int zz=;
for(int j=head1[i];j;j=e1[j].next){
b[++zz].x=e1[j].y; b[zz].y=e1[j].z; b[zz].v=a[e1[j].y].v;
}
sort(b+,b++zz,mcmp);
for(int j=;j<=zz;j++)init(b[j].x,b[j].y,b[j].v);
for(int j=;j<zz;j++){init(b[j+].y,b[j].y,); init(b[j].y,b[j+].y,b[j+].v-b[j].v);}
}
for(int i=;i<=cnt;i++){
if(a[i].y==n)init(i,T,a[i].v);
if(a[i].x==)init(S,i,a[i].v);
}
Dij();
printf("%lld\n",dis[T]);
return ;
}

BZOJ 4289: PA2012 Tax 差分建图 最短路的更多相关文章

  1. ●BZOJ 4289 PA2012 Tax

    ●赘述题目 算了,题目没有重复的必要. 注意理解:对答案造成贡献的是每个点,就是了. 举个栗子: 对于如下数据: 2 1 1 2 1 答案是 2: ●题解 方法:建图(难点)+最短路. 先来几个链接: ...

  2. bzoj 4289: PA2012 Tax

    Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...

  3. BZOJ.4289.PA2012 Tax(思路 Dijkstra)

    题目链接 \(Description\) 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价 ...

  4. bzoj 4289 PA2012 Tax——构图

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 可以把一个点上的边按权值排序,然后边权小的向第一个比它大的连差值的边,边权大的向第一个 ...

  5. BZOJ 4289: PA2012 Tax(最短路)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 755  Solved: 240[Submit][Status][Discuss] Descriptio ...

  6. 【刷题】BZOJ 4289 PA2012 Tax

    Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...

  7. BZOJ 4289: PA2012 Tax Dijkstra + 查分

    Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...

  8. [BZOJ4289] [PA2012] Tax 解题报告 (最短路+差分建图)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 4289: PA2012 Tax Time Limit: 10 Sec  Memo ...

  9. uva10067 Playing with Wheels 【建图+最短路】

    题目:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1008">uva10067 Play ...

随机推荐

  1. 安卓微信、QQ自带浏览器 UXSS 漏洞

    安卓微信.QQ自带浏览器 UXSS 漏洞 注:PDF报告原文下载链接 Author: hei@knownsec.com Date: 2016-02-29 一.漏洞描述 在安卓平台上的微信及QQ自带浏览 ...

  2. 10 Useeful Tips for Writing Effective Bash Scripts in Linux

    1.Always Use Comments in Scripts2.Make a Scripts exit When Fails    Sometimes bash may continue to e ...

  3. Runtime - 消息发送原理

    Runtime - 消息发送原理. Objective-C运行时的核心就在于消息分派器objc_msgSend,消息分派器把选择器映射为函数指针,并调用被引用的函数. 要想理解objc_msgSend ...

  4. jdbc一次性采集mysql和oracle的海量数据,5000W+为例

    最近做的采集工具遇到采集一天数据(超过5000W行数据)的情况, 采集mysql的时候直接采用流式读取的方式可以一次全部都读取出来,速度的话取决于网络速度 stmt = conn.createStat ...

  5. WebApi Owin SelfHost OAuth2 - 授权服务和资源服务分离方案

    使用JWT 参考:http://www.cnblogs.com/grissom007/p/6294746.html

  6. React 学习二 组件

    React的一个最大的特点就是组件化的开发模式.今天就来试一下: <!DOCTYPE html> <html> <head> <meta charset=&q ...

  7. 虚拟机 SUSE Linux Enterprise Server 12 SP2 64

    下载地址:https://www.suse.com/zh-cn/products/server/download/ 下载以后使用虚拟机安装即可

  8. java基础65 JavaScript中的Window对象(网页知识)

    1.javaScript组成部分 1.EMCAScript(基本语法)    2.BOM(Browser Object Model):浏览器对象模型            浏览器对象模型中的浏览器的各 ...

  9. Oracle学习笔记:实现select top N的方法

    由于Oracle不支持select top N语句,所以在Oracle中需要利用order by和rownum的组合来实现select top N的查询. rownum是记录表中数据编号的一个隐藏字段 ...

  10. jenkins Error performing command: git ls-remote -h

    Jenkins新建项目中源码管理使用Git时遇到如下问题: Failed to connect to repository : Error performing command: git ls-rem ...