Guide AHOI2017 洛谷P3720

Description

农场主John最近在网上买了一辆新车,在购买汽车配件时,John不小心点了两次“提交”按钮。导致汽车上安装了两套GPS系统,更糟糕的是John在使用GPS导航时,两套系统常常给出不同的路线。从地图上看,John居住的地区有N个十字路口和M条限定通行方向的道路。第i条道路连接路口A_i(1≤A_i≤N)和B_i(1≤B_i≤N),两个路口之间可能连接有多条道路。允许双向通⾏的道路是将两条单向通⾏的道路隔开所形成的。 John的家在路口1位置,农场在路口N的位置。John可以沿着⼀系列单向道路从家驾车到农场。所有GPS系统的底层地图信息都是⼀样的,区别仅在于对每一条道路的通⾏时间计算不同。对于第i条道路第一套GPS系统计算通行时间为P_i个单位时间,而第二套GPS系统则给出Q_i个单位时间。(所有道路的通行时间都是范围在1到100,000之间的整数)John想要驾车从家到农场。可是,一路上GPS系统总是不厌其烦的提醒John(请从路口X开往路口Y),这是由于John选取了某套GPS系统建议的路径,而另一套GPS系统则认为这不是从路口X到农场的最短路径。我们称之为GPS系统的抱怨。 请你计算一下如果John选择合适的路径到达农场能听到的最少GPS系统的抱怨数 。如果John经过某条道路两套GPS系统都发出抱怨,则抱怨总数加2。

Input

第一行,两个整数N和M。接下来M行,其中第i行描述了道路i的信息,A_i B_i P_i Q_i。

Output

一个整数,表示John一路上能听到的最小抱怨数。

Hint

2≤N≤100000,1≤M≤500000。

Solution

洛谷上面的题都坑爹得一批,指针也坑爹得一批,然后这道题成功地两条都应验了。。。

呃这道题首先是个最短路然后要建三张图跑三次,Dijkstra和SPFA好像都可以不过为了复习SPFA我还是写的SPFA即使它非常地坑人。。嗯然后两个GPS的最短路径各跑一遍,然后用一个for循环预处理出第三个图的边权,也就是这个听抱怨的图的边权,然后只要他没有听GPS1或者2的都要++,都没听就会++两次,然后最后再跑一次SPFA就可以了。

注意事项: 1.指针不能sizeof我要是再被这个坑了我就去自杀一百遍。。。 2.这个因为最后到的是n所以既然是单源最短路径就要从n开始,而且,而且,而且,要,建,反图。 3.好的我还是傻逼还是非常地弱,没了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#define maxn 500005
#define inf 0x3f3f3f3f
using namespace std;
int n,m,node1,x,y,z1,z2,node2,node3;
struct Edge{int u;int v;int w;int next;
}edge1[maxn],edge2[maxn],edge3[maxn];
int first1[maxn],last1[maxn],first2[maxn];
int last2[maxn],first3[maxn],last3[maxn];
int dist1[maxn],dist2[maxn],dist3[maxn];
bool vis1[maxn],vis2[maxn],vis3[maxn];
void addedge1(int u,int v,int w){edge1[++node1]=(Edge){u,v,w,0};if(first1[u]==0)first1[u]=node1;else edge1[last1[u]].next=node1;last1[u]=node1;
}
void addedge2(int u,int v,int w){edge2[++node2]=(Edge){u,v,w,0};if(first2[u]==0)first2[u]=node2;else edge2[last2[u]].next=node2;last2[u]=node2;
}
void addedge3(int u,int v,int w){edge3[++node3]=(Edge){u,v,w,0};if(first3[u]==0)first3[u]=node3;else edge3[last3[u]].next=node3;last3[u]=node3;
}
void init(){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d%d%d",&x,&y,&z1,&z2);addedge1(y,x,z1);addedge2(y,x,z2);addedge3(y,x,0);}
}
void spfa1(int s,int *d){queue<int>pq;memset(d,inf,sizeof(dist1));d[s]=0;vis1[s]=true;pq.push(s);while(!pq.empty()){int u=pq.front();pq.pop();vis1[u]=false;for(int k=first1[u];k;k=edge1[k].next){int v=edge1[k].v;if(d[u]+edge1[k].w<=d[v]){d[v]=d[u]+edge1[k].w;if(!vis1[v]){vis1[v]=true;pq.push(v);}}}}
}
void spfa2(int s,int *d){queue<int>pq;memset(d,inf,sizeof(dist2));d[s]=0;vis2[s]=true;pq.push(s);while(!pq.empty()){int u=pq.front();pq.pop();vis2[u]=false;for(int k=first2[u];k;k=edge2[k].next){int v=edge2[k].v;if(d[u]+edge2[k].w<=d[v]){d[v]=d[u]+edge2[k].w;if(!vis2[v]){vis2[v]=true;pq.push(v);}}}}
}
void spfa3(int s,int *d){queue<int>pq;memset(d,inf,sizeof(dist3));d[s]=0;vis3[s]=true;pq.push(s);while(!pq.empty()){int u=pq.front();pq.pop();vis3[u]=false;for(int k=first3[u];k;k=edge3[k].next){int v=edge3[k].v;if(d[u]+edge3[k].w<=d[v]){d[v]=d[u]+edge3[k].w;if(!vis3[v]){vis3[v]=true;pq.push(v);}}}}
}
int main(){init();spfa1(n,dist1);spfa2(n,dist2);for(int i=1;i<=n;i++){for(int k=first3[i];k;k=edge3[k].next){int u=edge3[k].v;if(dist1[i]+edge1[k].w!=dist1[u])edge3[k].w++;if(dist2[i]+edge2[k].w!=dist2[u])edge3[k].w++;}}spfa3(n,dist3);printf("%d\n",dist3[1]);return 0;
}

转载于:https://www.cnblogs.com/virtual-north-Illya/p/10045162.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

稳坐视频云行业第一,阿里云将用边缘计算开辟新赛道

“CDN竞争的上半场已结束&#xff0c;中国视频云市场格局已定&#xff0c;边缘计算将成为下半场发展的新赛道。” 4月10日&#xff0c;阿里云视频云总经理、边缘计算负责人朱照远在第七届“亚太内容分发大会”暨CDN峰会表示。朱照远认为&#xff0c;阿里云依靠齐全的产品矩阵、…

爱因斯坦提出的逻辑性问题_提出正确问题的重要性

爱因斯坦提出的逻辑性问题We live in a world that values answers. We were taught in school to learn how to answer questions in exams, we were conditioned to go to work knowing that we need to have the answers and our society, by and large, focuses on finding…

python安装包

由于Google、YouTube等大型公司的推广&#xff0c;Python编程语言越来越受欢迎&#xff0c;很多编程爱好者&#xff0c;也将Python做为了首先的编程语言。 今天我们就来讲一下&#xff0c;学习的第一步&#xff0c;安装Python IDLE编辑器&#xff0c;也它的调试和使用。 第一步…

104 权限 sudo 解压缩

主要内容:https://www.cnblogs.com/pyyu/articles/9355477.html 1 查看系统版本信息: #查看系统版本信息 cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) #查看内核版本号 uname -r 3.10.0-693.el7.x86_64 #查看系统多少位 uname -m x86_64 #查看内核所有信息…

Cloud Native 介绍

为什么80%的码农都做不了架构师&#xff1f;>>> 背景 Cloud Native表面看起来比较容易理解&#xff0c;但是细思好像又有些模糊不清&#xff1a;Cloud Native和Cloud关系是啥&#xff1f;它用来解决什么问题&#xff1f;它是一个新技术还是一个新的方法&#xff1f…

餐厅数据分析报告_如何使用数据科学选择理想的餐厅设计场所

餐厅数据分析报告空间数据科学 (Spatial Data Science) Designing any product requires a lot of analysis and research. It is also true for designing any building. Before we begin to design any building, we collect information about the location where we are de…

P2P原理及UDP穿透简单说明

本文章出自cnntec.com的AZ猫著&#xff0c;如需要转发&#xff0c;请注明来自cnntec.com Peer-To-Peer缩写P2P 中文称之为对等联网。 用途于交流&#xff0c;比如QQ&#xff0c;MSN等等。 文件传输、分布式数据计算等等。 这里我们主要是是简单讲解一下UDP实现NAT的穿透&…

PCB genesis 大孔扩孔(不用G84命令)实现方法

PCB钻孔时,当钻刀>6.3mm时,超出钻孔范围,钻孔工序是没有这么大的钻刀,当这种情况,工程CAM会都采用G84命令用小孔扩孔的方式制作, 在这里介绍一种如果不用G84命令,用程序实现将大孔生成小孔钻孔达到扩孔的目的。 一.我们先了解一下G84命令扩孔 孔尺寸大小 孔密度 连一篇文章有…

一年没做出量化策略_量化信念:如何做出更好的决定

一年没做出量化策略By Stuart George, Executive Director of Design Technology at MethodMethod设计技术执行总监Stuart George When Andrew Mason, founder of Groupon, wanted to improve his email conversion metrics, he turned to data analysis. His team tested the…

Android Jetpack组件之数据库Room详解(二)

本文涉及Library的版本如下&#xff1a; androidx.room:room-runtime:2.1.0-alpha03androidx.room:room-compiler:2.1.0-alpha03(注解编译器)回顾一下安卓的SQLiteOpenHelper相关类 首先放一个关于安卓数据库的类图: SQLiteOpenHelper是一个抽象类&#xff0c;通常自己实现数据…

图像识别中的深度学习

来源&#xff1a;《中国计算机学会通讯》第8期《专题》 作者&#xff1a;王晓刚 深度学习发展历史 深度学习是近十年来人工智能领域取得的重要突破。它在语音识别、自然语言处理、计算机视觉、图像与视频分析、多媒体等诸多领域的应用取得了巨大成功。现有的深度学习模型属于神…

多个css样式合并到一个“目录”css文件中

执行访问jsp后发现没有效果 同样的代码&#xff0c;在html中效果对比如下&#xff1a; 具体原因&#xff1a;不清楚&#xff0c;暂时记着~~~在jsp中不支持import这种css样式的引用 转载于:https://www.cnblogs.com/mangwusuozhi/p/10050108.html

Git 学习笔记之 merge

Merge: 1、Fast-forward&#xff08;快进式&#xff09; 2、recursice strategy (策略合并&#xff0c;三方合并) Fast-forward 策略合并 //创建一个文件夹&#xff0c;并初始化 Git mkdir GitDemo cd GitDemo git init//初次提交&#xff0c;创建 master 分支 touch master.tx…

熊猫直播 使用什么sdk_没什么可花的-但是16项基本操作才能让您开始使用熊猫

熊猫直播 使用什么sdkPython has become the go-to programming language for many data scientists and machine learning researchers. One essential data processing tool for them to make this choice is the pandas library. For sure, the pandas library is so versat…

萌新一手包App前后端开发日记(一)

从事Android移动端也有些日子了&#xff0c;还记得一开始选择这份工作&#xff0c;是憧憬着有朝一日能让亲朋好友用上自己开发的软件&#xff0c;但日子久了才发现&#xff0c;并不是所有的公司&#xff0c;所有的项目的适用群体都是“亲朋好友”&#xff0c;/无奈脸 摊手。当…

方差,协方差 、统计学的基本概念

一、统计学的基本概念 统计学里最基本的概念就是样本的均值、方差、标准差。首先&#xff0c;我们给定一个含有n个样本的集合&#xff0c;下面给出这些概念的公式描述&#xff1a; 均值&#xff1a; 标准差&#xff1a; 方差&#xff1a; 均值描述的是样本集合的中间点&#xf…

关系型数据库的核心单元是_核中的数据关系

关系型数据库的核心单元是Nucleoid is an open source (Apache 2.0), a runtime environment that provides logical integrity in declarative programming, and at the same time, it stores declarative statements so that it doesn’t require external database, in shor…

MongoDB第二天

集合的操作: db.表名称 show tables / collection db.表名.drop() 文档的操作: 插入数据 db.表名.insert({"name":"jerry"}) db.insertMany([{"name":"sb",...}]) var ul {"name":"sb"} db.sb.insert(ul) db.sb.…

Python 主成分分析PCA

Python 主成分分析PCA 主成分分析&#xff08;PCA&#xff09;是一种基于变量协方差矩阵对数据进行压缩降维、去噪的有效方法&#xff0c;PCA的思想是将n维特征映射到k维上&#xff08;k<n&#xff09;&#xff0c;这k维特征称为主元&#xff0c;是旧特征的线性组合&#xf…

小程序 国际化_在国际化您的应用程序时忘记的一件事

小程序 国际化The hidden bugs waiting to be found by your international users您的国际用户正在等待发现的隐藏错误 While internationalizing our applications, we focus on the things we can see: text, tool-tips, error messages, and the like. But, hidden in our …