●BZOJ 4289 PA2012 Tax
●赘述题目
算了,题目没有重复的必要。
注意理解:对答案造成贡献的是每个点,就是了。
举个栗子:
对于如下数据:
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的更多相关文章
- BZOJ 4289: PA2012 Tax 差分建图 最短路
https://www.lydsy.com/JudgeOnline/problem.php?id=4289 https://www.cnblogs.com/clrs97/p/5046933.html ...
- bzoj 4289 PA2012 Tax——构图
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 可以把一个点上的边按权值排序,然后边权小的向第一个比它大的连差值的边,边权大的向第一个 ...
- bzoj 4289: PA2012 Tax
Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...
- BZOJ.4289.PA2012 Tax(思路 Dijkstra)
题目链接 \(Description\) 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价 ...
- 【刷题】BZOJ 4289 PA2012 Tax
Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...
- BZOJ 4289: PA2012 Tax(最短路)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 755 Solved: 240[Submit][Status][Discuss] Descriptio ...
- BZOJ 4289: PA2012 Tax Dijkstra + 查分
Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...
- [BZOJ4289] [PA2012] Tax 解题报告 (最短路+差分建图)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 4289: PA2012 Tax Time Limit: 10 Sec Memo ...
- 「BZOJ 4289」 PA2012 Tax
「BZOJ 4289」 PA2012 Tax 题目描述 给出一个 \(N\) 个点 \(M\) 条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点 \(1\) 到点 \( ...
随机推荐
- 每日冲刺报告-Day3
敏捷冲刺每日报告--Day3 情况简介 今天的任务是把json处理函数加入到爬虫中,把搜索到的结果存到json文件里去. 任务进度 赵坤:在爬虫中加入了json处理的代码,解决了在控制台打印中文列表/ ...
- django 连接mysql
环境 Linux 修改工程目录下的settings.py 文件 #!!!!!!!!切勿出现中文 即便//注释也不行 DATABASES = { 'default': { 'ENGINE': 'djan ...
- Error contacting service. It is probably not running.
平台:centos-6.3-i386 jdk-7u51 storm 0.9.1 python 2.6.6 hadoop 1.2.1 运行zookeeperd后显示启动成功: JMX enabled ...
- GPUImage实战问题解决
在项目中遇到了使用完GPUImage以后,内存不释放的问题,翻阅官方API,找到了解决方法: deinit{ GPUImageContext.sharedImageProcessingContext( ...
- 开始使用HTML5和CSS3验证表单
使用HTML5和CSS3验证表单 客户端验证是网页客户端程序最常用的功能之一,我们之前使用了各种各样的js库来进行表单的验证.HTML5其实早已为我们提供了表单验证的功能.至于为啥没有流行起来估计是兼 ...
- MongoDB 副本集管理
一.以单机模式启动成员节点 有时候出于维护的需要,需要以单机模式启动某个节点而不是一个副本集成员身份. 1).首先查询服务器命令行参数 db.serverCmdLineOpts() 2).关闭当前副本 ...
- linux系统增加开机启动服务/应用
操作 在/etc/init.d下新建示例脚本文件(customize.sh),该脚本会启动zookeeper服务.内容如下: #!/bin/sh /usr/local/zookeeper-/bin/z ...
- python实现维吉尼亚解密
# -*-coding:UTF-8-*- from sys import stdout miwen = "KCCPKBGUFDPHQTYAVINRRTMVGRKDNBVFDETDGILTXR ...
- 详解k8s一个完整的监控方案(Heapster+Grafana+InfluxDB) - kubernetes
1.浅析整个监控流程 heapster以k8s内置的cAdvisor作为数据源收集集群信息,并汇总出有价值的性能数据(Metrics):cpu.内存.网络流量等,然后将这些数据输出到外部存储,如Inf ...
- c# 几种深拷贝方式的比较
public static class Tools { //利用 BinaryFormatter 实现深拷贝 public static T DeepCopyByBinary<T>(thi ...