1087 All Roads Lead to Rome(最短路求最大权值,最短路路径条数,节点个数,回溯路径)

本文主要是介绍1087 All Roads Lead to Rome(最短路求最大权值,最短路路径条数,节点个数,回溯路径),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(这题基本上把最短路能求的都求了个遍,除了麻烦一点,难度其实还好) 

(卡题原因:dijks漏了对路径条数的初始化。)

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k;
string st,ed;
map<string,int>mp;
map<int,string>name;
map<int,int>w;
int e[210][210];
int indx=0;
int getID(string s){if(mp.count(s)){return mp[s];}name[indx]=s;mp[s]=indx++;return mp[s];
}
int dist[210];
int hap[210],num[210];
int sum[210];
int p[210];
bool vis[210];
void dijks(int u){memset(dist,0x3f,sizeof dist);memset(vis,0,sizeof vis);memset(p,-1,sizeof p);dist[u]=0;sum[u]=1;//记得每个都要初始化,漏了这个,结果debug半多小时for(int i=0;i<indx;i++){u=-1;int mi=INT_MAX;for(int j=0;j<indx;j++){if(!vis[j]&&mi>dist[j]){u=j;mi=dist[j];}}if(u==-1)break;vis[u]=1;for(int j=0;j<indx;j++){if(!vis[j]){if(dist[j]==dist[u]+e[u][j]){sum[j]=sum[u]+sum[j];if(hap[j]==hap[u]+w[j]){if(num[j]>num[u]+1){p[j]=u;num[j]=num[u]+1;}}else if(hap[j]<hap[u]+w[j]){p[j]=u;hap[j]=hap[u]+w[j];num[j]=num[u]+1;}}else if(dist[j]>dist[u]+e[u][j]){sum[j]=sum[u];p[j]=u;dist[j]=dist[u]+e[u][j];hap[j]=hap[u]+w[j];num[j]=num[u]+1;}}}}u=getID(ed);cout<<sum[u]<<' '<<dist[u]<<' '<<hap[u]<<' '<<(hap[u])/num[u]<<endl;
}
int flag=0;
void dfs(int u){if(u==-1)return ;dfs(p[u]);if(flag)cout<<"->";cout<<name[u];flag=1;
}
signed main(){cin>>n>>k>>st;memset(e,0x3f,sizeof e);ed="ROM";getID(st);getID(ed);for(int i=0;i<n-1;i++){string city;cin>>city;int d;cin>>d;w[getID(city)]=d;// cout<<getID(city)<<' ';}w[getID(st)]=0;for(int i=0;i<k;i++){string c1,c2;cin>>c1>>c2;int a,b,d;cin>>d;a=getID(c1);b=getID(c2);e[a][b]=e[b][a]=d;}dijks(getID(st));dfs(getID(ed));
}

这篇关于1087 All Roads Lead to Rome(最短路求最大权值,最短路路径条数,节点个数,回溯路径)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/430435

相关文章

随想录 Day 69 并查集 107. 寻找存在的路径

随想录 Day 69 并查集 107. 寻找存在的路径 理论基础 int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好vector<int> father = vector<int> (n, 0); // C++里的一种数组结构// 并查集初始化void init() {for (int i = 0; i < n; ++i) {father[i] = i;}

chart 完成拓扑图单节点拖拽不影响其他节点位置

就是做这种的功能,箭头原本是可以动态重复移动的,但不知道哪里问题导致没箭头了,然后补了个edgeSymbol: ['','arrow'], 字段,才增加了箭头。 拖拽某个节点,只有关联到的线条会跟着变动其他的节点位置不变。 参考 https://gallery.echartsjs.com/editor.html?c=x8Fgri22P9 https://echarts.baidu.com/exa

SQL Server中,用Restore DataBase把数据库还原到指定的路径

restore database 数据库名 from disk='备份文件路径' with move '数据库文件名' to '数据库文件放置路径', move '日志文件名' to '日志文件存放置路径' Go 如: restore database EaseWe from disk='H:\EaseWe.bak' with move 'Ease

算法与数据结构面试宝典——回溯算法详解(C#,C++)

文章目录 1. 回溯算法的定义及应用场景2. 回溯算法的基本思想3. 递推关系式与回溯算法的建立4. 状态转移方法5. 边界条件与结束条件6. 算法的具体实现过程7. 回溯算法在C#,C++中的实际应用案例C#示例C++示例 8. 总结回溯算法的主要特点与应用价值 回溯算法是一种通过尝试各种可能的组合来找到所有解的算法。这种算法通常用于解决组合问题,如排列、组合、棋盘游

(13)DroneCAN 适配器节点(一)

文章目录 前言 1 特点 2 固件  3 ArduPilot固件DroneCAN设置 4 DroneCAN适配器节点 前言 这些节点允许现有的 ArduPilot 支持的外围设备作为 DroneCAN 或 MSP 设备适应 CAN 总线。这也允许扩展自动驾驶仪硬件的功能。如允许 I2C 设备(如罗盘或空速)距离自动驾驶仪 1m 以上,并实现多达 32 个伺服输出通道。

C# 命名管道中客户端访问服务器时,出现“对路径的访问被拒绝”

先还原一下我出现错误的情景:我用C#控制台写了一个命名管道服务器,然后用ASP.NET写了一个客户端访问服务器,运行之后出现了下面的错误: 原因:服务器端的访问权限不够,所以是服务器端的问题,需要增加访问权限。(网上很多都说是文件夹的权限不够,情况不同,不适用于我这种情况) 解决办法: (1)在服务器端相应地方添加以下代码。 PipeSecurity pse = new PipeSec

剑指Offer—编程题10(二进制中1 的个数)

代码如下,请在JDK7及以上版本运行: public class Test10 {/*** 请实现一个函数, 输入一个整数,输出该数二进制表示中1的个数。* 例如把9表示成二进制是1001 ,有2位是1. 因此如果输入9,该出2。** @param n 待的数字* @return 数字中二进制表表的1的数目*/public static int numberOfOne(int

代码随想录算法训练营第三十九天|62.不同路径 63. 不同路径 II 343.整数拆分 96.不同的二叉搜索树

LeetCode 62.不同路径 题目链接:62.不同路径 踩坑:二维的vector数组需要初始化,否则会报错访问空指针 思路: 确定动态数组的含义:dp[i][j]:到达(i,j)有多少条路经递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1]初始化动态数组:dp[0][0] = 1遍历顺序:从左到右,从上到下 代码: class Solution {pu

关于修改计算机的处理器数和最大内存数的问题

问题描述: 刚开始本来是想让计算机的运行速度运行的快点,于是在网上搜索如何让计算机的运行速度更快,找到了一种关于修改计算机内存数和计算机的处理核数可以让计算机运行的更快。 遇到问题: 当我通过命令msconfig →引导→高级选项→勾选了处理器数和最大内存数,然后重启,结构整个计算机都卡的要死,于是记录下来。网上的答案有时候真的是很不负责任,也有可能是自己技术不到位。 结果:取消处理器和内