383. 观光(最短路拓扑图)「建议收藏」

383. 观光(最短路拓扑图)「建议收藏」“您的个人假期”旅行社组织了一次比荷卢经济联盟的巴士之旅。比荷卢经济联盟有很多公交线路。每天公共汽车都会从一座城市开往另一座城市。沿途汽车可能会在一些城市(零或更多)停靠。旅行社计划旅途从 S 城市出发,到 F 城市结束。由于不同旅客的景点偏好不同,所以为了迎合更多旅客,旅行社将为客户提供多种不同线路。游客可以选择的行进路线有所限制,要么满足所选路线总路程为 S 到 F 的最小路程,要么满足所选路线总路程仅比最小路程多一个单位长度。如上图所示,如果 S=1,F=5,则这里有两条最短路线 1→

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

“您的个人假期”旅行社组织了一次比荷卢经济联盟的巴士之旅。

比荷卢经济联盟有很多公交线路。

每天公共汽车都会从一座城市开往另一座城市。

沿途汽车可能会在一些城市(零或更多)停靠。

旅行社计划旅途从 S 城市出发,到 F 城市结束。

由于不同旅客的景点偏好不同,所以为了迎合更多旅客,旅行社将为客户提供多种不同线路。

游客可以选择的行进路线有所限制,要么满足所选路线总路程为 S 到 F 的最小路程,要么满足所选路线总路程仅比最小路程多一个单位长度。

在这里插入图片描述

如上图所示,如果 S=1,F=5,则这里有两条最短路线 1→2→5,1→3→5,长度为 6;有一条比最短路程多一个单位长度的路线 1→3→4→5,长度为 7。

现在给定比荷卢经济联盟的公交路线图以及两个城市 S 和 F,请你求出旅行社最多可以为旅客提供多少种不同的满足限制条件的线路。

输入格式
第一行包含整数 T,表示共有 T 组测试数据。

每组数据第一行包含两个整数 N 和 M,分别表示总城市数量和道路数量。

接下来 M 行,每行包含三个整数 A,B,L,表示有一条线路从城市 A 通往城市 B,长度为 L。

需注意,线路是 单向的,存在从 A 到 B 的线路不代表一定存在从 B 到 A 的线路,另外从城市 A 到城市 B 可能存在多个不同的线路。

接下来一行,包含两个整数 S 和 F,数据保证 S 和 F 不同,并且 S、F 之间至少存在一条线路。

输出格式
每组数据输出一个结果,每个结果占一行。

数据保证结果不超过 109。

数据范围
2≤N≤1000,
1≤M≤10000,
1≤L≤1000,
1≤A,B,S,F≤N

输入样例:
2
5 8
1 2 3
1 3 2
1 4 5
2 3 1
2 5 3
3 4 2
3 5 4
4 5 3
1 5
5 6
2 3 1
3 2 1
3 1 10
4 5 2
5 2 7
5 2 7
4 1
输出样例:
3
2

题解
最短路拓扑图

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int INF = 0x3f3f3f3f;
const int N = 1e3 + 10;
const int M = 2e4 + 10;
struct Ver{ 
   
    int id,type,dist;
    bool operator > ( const Ver &w)const{ 
   
        return dist > w.dist;
    }
};
int head[N],c;
struct Edge{ 
   
    int v,w,next;
}edge[M];
void add(int u,int v,int w){ 
   
    edge[c].v = v;
    edge[c].w = w;
    edge[c].next = head[u];
    head[u] = c ++;
}
int vis[N][2],dist[N][2],cnt[N][2];
int dijstra(int s,int e){ 
   
    priority_queue<Ver,vector<Ver>,greater<Ver> >q;
    memset(dist,INF,sizeof dist);
    memset(cnt,0,sizeof cnt);
    memset(vis,0,sizeof vis);
    dist[s][0] = 0;
    cnt[s][0] = 1;
    q.push({ 
   s,0,dist[s][0]});
    while(!q.empty()){ 
   
        Ver t = q.top();
        q.pop();
        int type = t.type,id = t.id,d = t.dist;
        if(vis[id][type])continue;
        vis[id][type] = true;
        for(int i = head[id];~i;i = edge[i].next){ 
   
            int v = edge[i].v,w = edge[i].w;
            if(dist[v][0] > d + w){ 
   
                dist[v][1] = dist[v][0],cnt[v][1] = cnt[v][0];
                dist[v][0] = d + w,cnt[v][0] = cnt[id][type];
                q.push({ 
   v,0,dist[v][0]});
                q.push({ 
   v,1,dist[v][1]});
            }
            else if(dist[v][0] == d + w)cnt[v][0] += cnt[id][type];
            else if(d + w < dist[v][1])dist[v][1] = d + w,cnt[v][1] = cnt[id][type],q.push({ 
   v,1,dist[v][1]});
            else if(d + w == dist[v][1])cnt[v][1] += cnt[id][type];
        }
    }
    if(dist[e][1] == dist[e][0] + 1)return cnt[e][1] + cnt[e][0];
    return cnt[e][0];
}
int main(){ 
   
    int T;
    cin>>T;
    while(T --){ 
   
        int n,m;
        int s,e;
        cin>>n>>m;
        int x,y,w;
        memset(head,-1,sizeof head);
        c = 0;
        for(int i = 0;i < m;i ++){ 
   
            cin>>x>>y>>w;
            add(x,y,w);
        }
        cin>>s>>e;
        cout<<dijstra(s,e)<<endl;
    }
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169118.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月10日 下午8:36
下一篇 2022年8月10日 下午8:46


相关推荐

  • stap 命令

    stap 命令SystemTapacc forexample Command linescriptis e option stap e probesyscall write printf d n fd arg

    2026年3月19日
    2
  • discuz php接口文档,Discuz二次开发技术文档[通俗易懂]

    discuz php接口文档,Discuz二次开发技术文档[通俗易懂]点评:Discuz二次开发基本知识总结,需要对discuz进行二次开发的朋友可以参考下。一)Discuz!的文件系统目录注:想搞DZ开发,就得弄懂DZ中每个文件的功能。a)Admin:后台管理功能模块b)Api:DZ系统与其它系统之间接口程序c)Archiver:DZ中,用以搜索引擎优化的无图版d)Attachments:DZ中,用户上传附件的存放目录e)Customavatars…

    2022年5月12日
    41
  • 时间戳转换时间方法

    时间戳转换时间方法日常生产查询问题 需要将时间戳转换成时间 可以通过浏览器计算 通过 F12 打开开发者工具 gt 切到 console 控制台 输入 newDate 显示当前时间 newDate getTime 显示时间戳时间戳转标准时间 newDate 20 gt 转标准时间 newDate 2021 11 1619 24 27 920 gt 转时间戳计算前一天时间戳

    2026年3月16日
    2
  • Mac虚拟机联网(vmware虚拟机怎么联网)

    下载VMwareFusion安装,下载centOS7镜像并安装虚拟机查看本机的vmnet1和vmnet8MAC系统下通过终端的ifconfig命令可以得知当前主机的vmnet1(192.168.118.1)和vmnet8(192.168.2.1) 仅主机模式下通过vmnet1使得主机和虚拟机可以通信 NAT模式下通过vmnet8使得主机和虚拟机可以通信Mac终端cd/Libr…

    2022年4月12日
    139
  • L2正则化方法

    L2正则化方法在机器学习中 无论是分类还是回归 都可能存在由于特征过多而导致的过拟合问题 当然解决的办法有 1 减少特征 留取最重要的特征 2 惩罚不重要的特征的权重 但是通常情况下 我们不知道应该惩罚哪些特征的权重取值 通过正则化方法可以防止过拟合 提高泛化能力 先来看看 L2 正则化方法 对于之前梯度下降讲到的损失函数来说 在代价函数后面加上一个正则化项 得到 https www cnblogs

    2026年3月17日
    2
  • 测试用例的几种常见设计方法有哪些_测试理财产品的用例设计方法

    测试用例的几种常见设计方法有哪些_测试理财产品的用例设计方法测试用例常见的设计方法有:等价类划分法、边界值分析法、错误推测法、判定表法、正交实验法。一、等价类划分法顾名思义,顾名思义,等价类划分,就是将测试的范围划分成几个互不相交的子集,他们的并集是全集,从每个子集选出若干个有代表性的值作为测试用例。  例如,我们要测试一个用户名是否合法,用户名的定义为:8位数字组成的字符。  我们可以先划分子集:空用户名,1-7位数字,8位数字,9位或以…

    2022年8月31日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号