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. spring-boog-测试打桩-Mockito

    Mockito用于测试时进行打桩处理:通过它可以指定某个类的某个方法在什么情况下返回什么样的值. 例如:测试 controller时,依赖 service,这个时候就可以假设当调用 service 某 ...

  2. 【FCS NOI2018】福建省冬摸鱼笔记 day5

    第五天,也是讲课的最后一天. 数据结构专题,讲师:杨志灿 他的blog我似乎找不到了……以前肯定是在百度博客里面.但是现在百度博客消失了. PPT做的很有感觉,说了很多实用的技巧. 我觉得其实是收获最 ...

  3. C# 日文网址转punnycode

    Uri uri = new Uri(url); IdnMapping idn = new IdnMapping();url= url.Replace(uri.Host, idn.GetAscii(ur ...

  4. 使用数据库管理工具打开MySql

    1.推荐使用软件:Navicat_Premium_11.0.10.exe.  下载地址:http://pan.baidu.com/s/1nu6mTF7 2.下载上面文件并安装. 3.打开Navicat ...

  5. win、mac系统配置本地电脑ip为域名教程

    win系统: 如何修改hosts文件 主机文件原内容如下: #Copyright(c)1993-2009 Microsoft Corp. # #这是Windows的Microsoft TCP / IP ...

  6. 数据库-mysql索引

    MySQL 索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索 ...

  7. 手淘移动适配方案flexible.js兼容bug处理

    什么是flexible.js 移动端自适应方案 https://www.jianshu.com/p/04efb4a1d2f8 什么是rem 这个单位代表根元素的 font-size 大小(例如 元素的 ...

  8. JAVA复习笔记分布式篇:zookeeper

        前言:终于到分布式篇,前面把JAVA的一些核心知识复习了一遍,也是一个JAVA程序员最基本要掌握的知识点,接下来分布式的知识点算是互联网行业的JAVA程序员必备的技能:     概念:ZooK ...

  9. JAVA复习笔记之多线程并发

    前言:多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,还是值得深入研究一下 概念: 1 线程:进程中负责程序执行的执行单元线程本身依靠程序进行运行线程是程序中的顺序控制流,只能使用 ...

  10. Linux下LAMP服务器的搭建

    1.安装并配置Apache 安装apache的方法有很多种,这里选择通过yum方式进行安装,但需要Linux系统能够连接互联网,执行如下命令,安装Apache. # yum install httpd ...