[AHOI2017初中组]guide

[AHOI2017初中组]guide

最短路

题意

对于一张有向图,每条边有两个边权,有两套GPS会分别按两个边权计算所在到终点的最短路,如果你不按其中一套GPS说的路走,就会产生1的抱怨,求从起点到终点的最少抱怨数

题解

因为每次两套GPS都会判断当前要去的点是否在当前点到终点的最短路上,所以我们可以反向建边,跑出每套GPS从终点到每个点的最短路,然后我们重新建图,依次枚举原图的每条边,将边权赋值为2,如果要去的点在某套GPS的最短路上,边权减一.最后跑一遍最短路就可以得出\(ans\)

  • 反向建边
  • 反向SPFA
  • 边重构
  • 反向SPFA
  • \(ans\)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=1e5+10;
int n,m,head[maxn],num;
int dis[maxn],dis1[maxn],di[maxn];
bool use[maxn];
struct fy{int from,to,d,dd,e,next;}q[maxn*5];
void add(int a,int b,int c,int d)
{
    q[++num]=(fy){a,b,c,d,0,head[a]};head[a]=num;
}
void sp()
{
    memset(dis,0x3f,sizeof dis);dis[n]=0;
    memset(dis1,0x3f,sizeof dis1);dis1[n]=0;
    queue<int>qq;qq.push(n);use[n]=true;
    while(!qq.empty())
    {
        int a=qq.front();qq.pop();use[a]=false;
        for(int i=head[a];i;i=q[i].next)
        {
            int b=q[i].to;
            if(dis[b]>dis[a]+q[i].d)
            {
                dis[b]=dis[a]+q[i].d;
                if(!use[b]){use[b]=true;qq.push(b);}
            }
        }
    }
    qq.push(n);use[n]=true;
    while(!qq.empty())
    {
        int a=qq.front();qq.pop();use[a]=false;
        for(int i=head[a];i;i=q[i].next)
        {
            int b=q[i].to;
            if(dis1[b]>dis1[a]+q[i].dd)
            {
                dis1[b]=dis1[a]+q[i].dd;
                if(!use[b]){use[b]=true;qq.push(b);}
            }
        }
    }
}
void sp1()
{
    memset(di,0x3f,sizeof di);di[n]=0;
    queue<int>qq;qq.push(n);use[n]=true;
    while(!qq.empty())
    {
        int a=qq.front();qq.pop();use[a]=false;
        for(int i=head[a];i;i=q[i].next)
        {
            int b=q[i].to;
            if(di[b]>di[a]+q[i].e)
            {
                di[b]=di[a]+q[i].e;
                if(!use[b]){use[b]=true;qq.push(b);}
            }
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);int a,b,c,d;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d%d",&a,&b,&c,&d);
        add(b,a,c,d);
    }
    sp();//反向SPFA
    for(int i=1;i<=num;i++)//边重构
    {
        d=2;a=q[i].from;b=q[i].to;
        if(dis[b]==dis[a]+q[i].d)d--;
        if(dis1[b]==dis1[a]+q[i].dd)d--;
        q[i].e=d;
    }
    sp1();
    printf("%d\n",di[1]);
    return 0;
}

原文地址:https://www.cnblogs.com/ffdy/p/9798646.html

时间: 2024-10-10 08:18:10

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

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

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),两个路口之间可能连接有多条道路.允许双向通?的道路是将两条单向通?的道

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