P3720 [AHOI2017初中组]guide

题目描述

农场主John最近在网上买了一辆新车,在购买汽车配件时,John不小心点了两次“提交”按钮。导致汽车上安装了两套GPS系统,更糟糕的是John在使用GPS导航时,两套系统常常给出不同的路线。从地图上看,John居住的地区有N(2 ≤ N ≤ 100,000)个十字路口和M(1 ≤ M ≤ 500,000)条限定通行方向的道路。第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。

输入格式

第一行,两个整数N和M。

接下来M行,其中第i行描述了道路i的信息,A_i B_i P_i Q_i。

输出格式

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

输入输出样例

输入 #1复制

5 7 3 4 7 1
1 3 2 20
1 4 17 18
4 5 25 3
1 2 10 1
3 5 4 14
2 4 6 5

输出 #1复制

1
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int n,m,head[100005],j,Next[100005],adj1[100005],adj2[100005],adj3[100005],p,q,a,b,i,k,d[100005],d2[100005],lun[100005];
void Push(int u,int v,int w,int t){
    Next[++k]=head[u];
    head[u]=k;
    lun[k]=v;
    adj1[k]=w;
    adj2[k]=t;
}
struct str{
    int s,w;
};
bool operator <(str a,str b){
    return a.w>b.w;
}
int adj(int fl,int i){
    if(fl==1){return adj1[i];}
    if(fl==2){return adj2[i];}
    if(fl==3){return adj3[i];}
}
void Dijkstra(int fl){
    int i,vis[100005]={0};
    memset(d,0x7f7f7f,sizeof(d));
    d[n]=0;
    priority_queue<str> q;
    q.push((str){n,0});
    while(!q.empty()){
        str p=q.top();
        q.pop();
        if(vis[p.s]!=0){continue;}
        vis[p.s]=1;
        for(i=head[p.s];i!=0;i=Next[i])
            if(d[p.s]+adj(fl,i)<d[lun[i]]){
                d[lun[i]]=d[p.s]+adj(fl,i);
                q.push((str){lun[i],d[lun[i]]});
            }
    }
}
int main(){
    cin>>n>>m;
    for(i=1;i<=m;i++){
    cin>>a>>b>>p>>q;
        Push(b,a,p,q);
    }
    Dijkstra(1);
    for(i=1;i<=n;i++){d2[i]=d[i];}
    Dijkstra(2);
    for(i=1;i<=n;i++){
        for(j=head[i];j!=0;j=Next[j]){
            if(d2[i]+adj1[j]!=d2[lun[j]]){adj3[j]++;}
            if(d[i]+adj2[j]!=d[lun[j]]){adj3[j]++;}
        }
    }
    Dijkstra(3);
    cout<<d[1];
}

  

原文地址:https://www.cnblogs.com/xiongchongwen/p/11664467.html

时间: 2024-10-03 23:04:48

P3720 [AHOI2017初中组]guide的相关文章

[AHOI2017初中组]guide

[AHOI2017初中组]guide 最短路 题意 对于一张有向图,每条边有两个边权,有两套GPS会分别按两个边权计算所在到终点的最短路,如果你不按其中一套GPS说的路走,就会产生1的抱怨,求从起点到终点的最少抱怨数 题解 因为每次两套GPS都会判断当前要去的点是否在当前点到终点的最短路上,所以我们可以反向建边,跑出每套GPS从终点到每个点的最短路,然后我们重新建图,依次枚举原图的每条边,将边权赋值为2,如果要去的点在某套GPS的最短路上,边权减一.最后跑一遍最短路就可以得出\(ans\) 反向

luogu3720 [AHOI2017初中组]guide[最短路]

初中组..唉 题意有点误解,当前在x点走一步,gps产生代价条件是沿非x到n的最短路走. 直接倒着跑两遍$i\sim n$的两种最短路,然后枚举每条边走的时候是否可以在两种最短路上,不是就产生1个代价,然后以这个代价重新建图正着跑一遍最短路即可. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6

P3719 [AHOI2017初中组]rexp——递归模拟

P3719 [AHOI2017初中组]rexp 没有什么算法的题做起来真不适应,这道题深深讽刺了我想用栈维护匹配括号个数的想法: 递归解决就行了: 时刻注意函数返回值是什么,边界条件是什么: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1e5+10; typedef double dd; typedef long long ll; l

P3717 [AHOI2017初中组]cover

题目背景 以下为不影响题意的简化版题目. 题目描述 一个n*n的网格图上有m个探测器,每个探测器有个探测半径r,问这n*n个点中有多少个点能被探测到. 输入输出格式 输入格式: 第一行3个整数n,m,r 接下来m行,每行两个整数x,y表示第i个探测器的坐标 输出格式: 能被探测到的点的个数 输入输出样例 输入样例#1: 5 2 1 3 3 4 2 输出样例#1: 8 说明 1<=n,m<=100 太水了,不用差分就过了. #include<iostream> #include<

Luogu P3717 [AHOI2017初中组]cover

题目背景 以下为不影响题意的简化版题目. 题目描述 一个n*n的网格图上有m个探测器,每个探测器有个探测半径r,问这n*n个点中有多少个点能被探测到. 输入输出格式 输入格式: 第一行3个整数n,m,r 接下来m行,每行两个整数x,y表示第i个探测器的坐标 输出格式: 能被探测到的点的个数 输入输出样例 输入样例#1: 5 2 1 3 3 4 2 输出样例#1: 8 说明 1<=n,m<=100 Solution 水题-- 既然是水题,也就没有多考虑就做了,可能时空复杂度不是最低的,但也不想管

luogu cover

P3717 [AHOI2017初中组]cover 题目背景 以下为不影响题意的简化版题目. 题目描述 一个n*n的网格图上有m个探测器,每个探测器有个探测半径r,问这n*n个点中有多少个点能被探测到. 输入输出格式 输入格式: 第一行3个整数n,m,r 接下来m行,每行两个整数x,y表示第i个探测器的坐标 输出格式: 能被探测到的点的个数 输入输出样例 输入样例#1: 5 2 1 3 3 4 2 输出样例#1: 8 说明 1<=n,m<=100 #include <iostream>

EMC Networker And VMware Integration Guide

一.环境介绍 主机名称 IP 角色 版本 vcenter.xzxj.edu.cn 172.16.255.36 vcenter服务器 5.5 node01.xzxj.edu.cn 172.16.255.153 vsphere esxi 5.5 node02.xzxj.edu.cn 172.16.255.154 vsphere esxi 5.5 tsmbak.xzxj.edu.cn 172.16.255.80 networker服务器 8.2 ebr.xzxj.edu.cn 172.16.255.7

ThoughtWorks笔试题之Merchant&#39;s Guide To The Galaxy解析

一.背景 在某网站上看到ThoughtWorks在武汉招人,待遇在本地还算不错,就投递了简历.第二天HR就打开电话,基本了解了一下情况(工作环境不错,男人妹子比例:1:1,双休,六险一金,满一年年假15天,病假8天,月薪1W--2W).然后立马收到一封:Coding Assignment的笔试题目.网上搜索了一下,发现这个公司还是挺大的,公司面试流程是出了名的繁杂和苛刻.据说有8轮:电话面试=>笔试=>Homework=>结对编程(中午管饭)=>技术面试=>PM面试=>

guide dpdk

Welcome to DPDK Guide! Contents: Setting up DPDK Important Prerequisites Setting up repositories Red Hat Enterprise Linux Fedora Installing DPDK and related software Hugepages 2M Hugepages 1G Hugepages IOMMU Binding NIC drivers VFIO VFIO no-IOMMU UIO