●赘述题目

算了,题目没有重复的必要。

注意理解:对答案造成贡献的是每个点,就是了。

举个栗子:

对于如下数据:

2 1

1 2 1

答案是 2;

●题解

方法:建图(难点)+最短路。

先来几个链接:(他们为我解题提供了思路,但有些部分看得我有点mengbi)

http://blog.csdn.net/pure_w/article/details/55060079

http://www.cnblogs.com/clrs97/p/5046933.html

●建图:

1.把原图的双向边拆成两条单向边(权值不变)。并把每条单向边看成一个点(称为新图点);

2.建立源点S,S向1号点的出边(新图点)建单向边,权值为那些出边的权值。

3.建立汇点T,n号点的入边(新图点)向T建单向边,权值为那些入边的权值。

效果如下:

接下来是比较暴力的建边

(4.)枚举每个原图点X,把它的每条入边(新图点)向每条出边(新图点)建边,权值为这两条出入边的较大权值。(这样导致边巨多)

然后是比较优化的建边

4.(似乎叫差分边),枚举每个原图点X,先把它的出边(新图点)从小到大排序,排序后相邻的出边(新图点)间建两条有向边,小的指向大的边权为两者权值之差,大的指向小的边权为0。再枚举它的每个入边(新图点),向该原图点X的与该入边(新图点)权值相同的出边建边(为什么一定存在权值相同的入边和出边呢?因为我们把无向边变成了两个有向边),权值就为该相同权值。

(4.)和4.的建图效果如下:

最后,新图已经建好,用4.建完图后,点和边的数量都可以接受,跑一个dijkstra就好啦!

●代码

#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
struct node{
int p;long long d;
bool operator <(const node &rtm) const {return d>rtm.d;}
};
struct edge{
int to,co,next;
}e[400005*2],E[2000000];
int headin[100005],headout[100005],head[400010],nextout[400005*2],nextin[400005*2];
int st[200005];
int n,m,dnt=2,ent=1,S,T,cnt,p;
ll dis[400010];
bool vis[400010];
bool cmp(int x,int y) {return e[x].co<e[y].co;}
void add(int u,int v,int c){
e[dnt]=(edge){v,c,0}; nextout[dnt]=headout[u];
e[dnt]=(edge){v,c,0}; nextin[dnt]=headin[v];
headout[u]=headin[v]=dnt++; e[dnt]=(edge){u,c,0}; nextout[dnt]=headout[v];
e[dnt]=(edge){u,c,0}; nextin[dnt]=headin[u];
headout[v]=headin[u]=dnt++;
}
void ADD(int u,int v,int c) {E[ent]=(edge){v,c,head[u]}; head[u]=ent++;}
void make_something(int x){
cnt=0;
for(int i=headout[x];i;i=nextout[i]) st[++cnt]=i;
sort(st+1,st+cnt+1,cmp);
for(int i=1;i<cnt;i++) ADD(st[i],st[i+1],e[st[i+1]].co-e[st[i]].co),ADD(st[i+1],st[i],0);
for(int i=headin[x];i;i=nextin[i]) p=i^1,ADD(i,p,e[i].co);
}
void dijkstra(){
node u; int v;
memset(dis,0x7f,sizeof(dis));
priority_queue <node> q;
q.push((node){S,0}); dis[S]=0;
while(!q.empty()){
u=q.top(); q.pop();
if(vis[u.p]) continue; vis[u.p]=1;
for(int i=head[u.p];i;i=E[i].next){
v=E[i].to;
if(!vis[v]&&dis[v]>dis[u.p]+E[i].co){
dis[v]=dis[u.p]+E[i].co;
q.push((node){v,dis[v]});
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1,a,b,c;i<=m;i++) scanf("%d%d%d",&a,&b,&c),add(a,b,c);
// 建源点和汇点
S=dnt++; T=dnt++;
for(int i=headout[1];i;i=nextout[i]) ADD(S,i,e[i].co);
for(int i=headin[n];i;i=nextin[i]) ADD(i,T,e[i].co);
//枚举每一个原图点
for(int i=1;i<=n;i++) make_something(i);
dijkstra(); printf("%lld",dis[T]);
return 0;
}

●BZOJ 4289 PA2012 Tax的更多相关文章

  1. BZOJ 4289: PA2012 Tax 差分建图 最短路

    https://www.lydsy.com/JudgeOnline/problem.php?id=4289 https://www.cnblogs.com/clrs97/p/5046933.html  ...

  2. bzoj 4289 PA2012 Tax——构图

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

  3. bzoj 4289: PA2012 Tax

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

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

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

  5. 【刷题】BZOJ 4289 PA2012 Tax

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

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

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

  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. 「BZOJ 4289」 PA2012 Tax

    「BZOJ 4289」 PA2012 Tax 题目描述 给出一个 \(N\) 个点 \(M\) 条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点 \(1\) 到点 \( ...

随机推荐

  1. 项目Beta冲刺Day5

    项目进展 李明皇 今天解决的进度 服务器端还未完善,所以无法进行联动调试.对页面样式和逻辑进行优化 明天安排 前后端联动调试 林翔 今天解决的进度 完成维护登录态,实现图片上传,微信开发工具上传图片不 ...

  2. XML使用练习

    #!/usr/bin/env python # -*- coding:utf-8 -*- import requests from xml.etree import ElementTree as ET ...

  3. Hibernate与mysql的对应类型

    Hibernate映射类型 Java类型 标准SQL类型  integer  java.lang.Integer  integer  long  java.lang.Long  bigint  sho ...

  4. 02-移动端开发教程-CSS3新特性(中)

    1. 新的背景 背景在CSS3中也得到很大程度的增强,比如背景图片尺寸.背景裁切区域.背景定位参照点.多重背景等. 1.1 background-size设置背景图片的尺寸 cover会自动调整缩放比 ...

  5. 基本数据类型 Symbol

    ES6 规范之前, JavaScript 一共有六种数据类型,分别是五种基本数据类型: string . number , boolean , null , undefined ,和一种引用数据类型: ...

  6. 新概念英语(1-95)Tickets,please!

    Lesson 95 Tickets, please. 请把车票拿出来. Listen to the tape then answer this question. Why did George and ...

  7. Tesseract-OCR4.0识别中文与训练字库实例

    关于中文的识别,效果比较好而且开源的应该就是Tesseract-OCR了,所以自己亲身试用一下,分享到博客让有同样兴趣的人少走弯路. 文中所用到的身份证图片资源是百度找的,如有侵权可联系我删除. 一. ...

  8. python flask框架 数据库的使用

    #coding:utf8 from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # ...

  9. [CodeForces10D]LCIS(最长公共上升子序列) - DP

    Description 给定两个数列,求最长公共上升子序列,并输出其中一种方案. Input&Output Input 第一行一个整数n(0<n<=500),数列a的长度. 第二行 ...

  10. Java-NIO(九):管道 (Pipe)

    Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 代码使用示例: @Test public vo ...