图论-商旅旅行变形问题

本文探讨了一种图论问题的变形——商旅旅行问题的特殊情况,即从0号点出发,经过S个指定点再返回0号点的最短路径。通过Dijkstra算法找出S个点与其他点的最短路径,并结合商旅旅行问题的思路求解。给出问题的输入输出描述及代码实现。
摘要由CSDN通过智能技术生成
看如下问题:

给定一幅n个点m条边的图和S个一定要经过的点,问从0号点出发,经过这S个点再回到0号点的最短路径长度是多少。(S<=10)

这个问题初看起来,很难解决,但是它其实是商旅旅行问题的变形。

一定要经过s个点,那我们就只经过这s个点。我们先通过dijstra跑出这S点与其他点的最短路,然后就是已知这s个点的之间的j距离,然后求从0点遍历所有点然后回到的0点的问题了。商旅旅行问题。


输入描述:
第一行一个整数T(T <= 2)表示数据组数。
对于每组数据,第一行两个整数n,m表示点数和边数(1 <= n, m <= 100,000)。
接下来m行,每行三个整数x, y, z(0 < x, y < n, 0 <= z <= 1000)表示xy之间有一条长度为z的双向边;
接下来一个整数S。(S<=10)
接下来S行每行一个整数表示一定要经过的点。
数据保证有解。
输出描述:

T行,每行一个整数表示答案。

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;

const int inf=1e9+7;
const int maxn=1e5+100;
struct ege
{
    int to,cost;
};
vector<ege> G[maxn];
int dis[12][maxn],point[10];
int dp[(1<<13)][12];

void dijkstra(int p)//elog
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值