当前位置: 首页 > news >正文

自己做的旅游网站简介做网站的域名

自己做的旅游网站简介,做网站的域名,网站开发数据库设计的作用,化妆品网站建设公司目录 一、题目 二、解决方法 三、改进 一、题目 背景#xff1a; 在一个城市中#xff0c;有数个交通节点#xff0c;每个节点间有双向道路相连。每条道路具有一个初始权重#xff0c;代表通行该路段的成本#xff08;例如时间、费用等#xff09;。随着时间的变化 在一个城市中有数个交通节点每个节点间有双向道路相连。每条道路具有一个初始权重代表通行该路段的成本例如时间、费用等。随着时间的变化道路的权重可能会发生变化比如由于交通堵塞或道路维修。 问题 设计一个算法以处理以下两种类型的查询 更新查询给定两个节点及新的权重值更新这两个节点之间道路的权重。最短路径查询给定两个节点找出这两个节点之间的最短路径及其权重。 输入格式 输出格式 对于每个最短路径查询输出一个整数表示最短路径的权重。如果两个节点之间没有路径则输出 -1。 实际应用 这个问题可以应用于交通管理系统例如实时更新交通状况并为司机提供最优路线。也适用于网络数据流量管理其中节点代表数据中心道路代表连接它们的网络。 挑战 设计一个高效的数据结构来存储和更新节点间的道路权重。实现一个算法来快速回答最短路径查询考虑到道路权重可能频繁变化。 二、解决方法 解决 为了解决这个动态路径分析问题我们可以采用以下策略 数据结构使用邻接表来表示图其中每个节点都有一个列表存储它与其他节点的连接及其权重。路径更新对于更新操作我们只需要修改邻接表中对应的权重。最短路径查询使用 Dijkstra 算法来找到最短路径。由于权重可能会频繁变化我们在每次查询时都从头开始执行 Dijkstra 算法。 C实现 #include iostream #include vector #include queue #include climitsusing namespace std;typedef pairint, int pii; // pair of (weight, node)class Graph {int V; // Number of verticesvectorvectorpii adj; // Adjacency listpublic:Graph(int V) : V(V), adj(V) {}void addEdge(int u, int v, int w) {adj[u].push_back({w, v});adj[v].push_back({w, u}); // For undirected graph}void updateEdge(int u, int v, int w) {// Update weight for edge u-vfor (auto p : adj[u]) {if (p.second v) {p.first w;break;}}for (auto p : adj[v]) {if (p.second u) {p.first w;break;}}}int shortestPath(int source, int destination) {priority_queuepii, vectorpii, greaterpii pq;vectorint dist(V, INT_MAX);pq.push({0, source});dist[source] 0;while (!pq.empty()) {int u pq.top().second;pq.pop();for (auto [w, v] : adj[u]) {if (dist[v] dist[u] w) {dist[v] dist[u] w;pq.push({dist[v], v});}}}return (dist[destination] INT_MAX) ? -1 : dist[destination];} };int main() {int N, M, u, v, w;cin N M;Graph g(N);for (int i 0; i M; i) {cin u v w;g.addEdge(u, v, w);}// Querieschar queryType;while (cin queryType) {if (queryType U) {cin u v w;g.updateEdge(u, v, w);} else if (queryType Q) {cin u v;cout g.shortestPath(u, v) endl;}}return 0; }Python import heapqclass Graph:def __init__(self, V):self.V Vself.graph {i: {} for i in range(V)}def add_edge(self, u, v, w):self.graph[u][v] wself.graph[v][u] wdef update_edge(self, u, v, w):if v in self.graph[u]:self.graph[u][v] wif u in self.graph[v]:self.graph[v][u] wdef shortest_path(self, source, destination):dist [float(inf)] * self.Vdist[source] 0pq [(0, source)]while pq:d, u heapq.heappop(pq)if d dist[u]:continuefor v, w in self.graph[u].items():if dist[u] w dist[v]:dist[v] dist[u] wheapq.heappush(pq, (dist[v], v))return dist[destination] if dist[destination] ! float(inf) else -1# Example usage g Graph(N) # N is the number of vertices # Add edges and handle queries similarly to the C exampleJAVA import java.util.*;public class Graph {private int V;private MapInteger, MapInteger, Integer adj;public Graph(int V) {this.V V;this.adj new HashMap();for (int i 0; i V; i) {adj.put(i, new HashMap());}}public void addEdge(int u, int v, int w) {adj.get(u).put(v, w);adj.get(v).put(u, w);}public void updateEdge(int u, int v, int w) {if (adj.get(u).containsKey(v)) {adj.get(u).put(v, w);}if (adj.get(v).containsKey(u)) {adj.get(v).put(u, w);}}public int shortestPath(int source, int destination) {int[] dist new int[V];Arrays.fill(dist, Integer.MAX_VALUE);dist[source] 0;PriorityQueueint[] pq new PriorityQueue(Comparator.comparingInt(a - a[1]));pq.add(new int[]{source, 0});while (!pq.isEmpty()) {int[] current pq.poll();int u current[0];if (u destination) {break;}for (Map.EntryInteger, Integer entry : adj.get(u).entrySet()) {int v entry.getKey();int weight entry.getValue();if (dist[u] weight dist[v]) {dist[v] dist[u] weight;pq.add(new int[]{v, dist[v]});}}}return dist[destination] Integer.MAX_VALUE ? -1 : dist[destination];}// Example usagepublic static void main(String[] args) {Graph g new Graph(N); // N is the number of vertices// Add edges and handle queries similarly to the C example} }Go语言 package mainimport (container/heapfmtmath )type Edge struct {node, weight int }type Graph struct {V intedges map[int]map[int]int }func NewGraph(V int) *Graph {g : Graph{V: V,edges: make(map[int]map[int]int),}for i : 0; i V; i {g.edges[i] make(map[int]int)}return g } func (g *Graph) UpdateEdge(u, v, w int) {if _, ok : g.edges[u][v]; ok {g.edges[u][v] w}if _, ok : g.edges[v][u]; ok {g.edges[v][u] w} }func (g *Graph) ShortestPath(source, destination int) int {dist : make([]int, g.V)for i : range dist {dist[i] math.MaxInt32}dist[source] 0pq : make(PriorityQueue, 0)heap.Init(pq)heap.Push(pq, Item{value: source,priority: 0,})for pq.Len() 0 {item : heap.Pop(pq).(*Item)u : item.valueif u destination {break}for v, w : range g.edges[u] {if dist[u]w dist[v] {dist[v] dist[u] wheap.Push(pq, Item{value: v,priority: dist[v],})}}}if dist[destination] math.MaxInt32 {return -1}return dist[destination] }// Define the priority queue used for Dijkstras algorithm type Item struct {value int // The node indexpriority int // The nodes priority (distance)index int // The index of the item in the heap }type PriorityQueue []*Itemfunc (pq PriorityQueue) Len() int { return len(pq) }func (pq PriorityQueue) Less(i, j int) bool {return pq[i].priority pq[j].priority }func (pq PriorityQueue) Swap(i, j int) {pq[i], pq[j] pq[j], pq[i]pq[i].index ipq[j].index j }func (pq *PriorityQueue) Push(x interface{}) {n : len(*pq)item : x.(*Item)item.index n*pq append(*pq, item) }func (pq *PriorityQueue) Pop() interface{} {old : *pqn : len(old)item : old[n-1]old[n-1] nilitem.index -1*pq old[0 : n-1]return item }func main() {// Example usageg : NewGraph(N) // N is the number of vertices// Add edges and handle queries similarly to the C example }三、改进 效率问题每次查询最短路径时都需要从头执行 Dijkstra 算法。在频繁更新边权重的场景中这可能导致效率低下。数据结构选择现有实现使用邻接表来存储图这对于稀疏图是合适的。但对于密集图这种表示方式可能导致内存使用不经济。 改进 增量更新算法对于频繁更新的场景可以考虑使用更高级的图算法如“动态最短路径算法”。这类算法可以在不重新计算整个图的情况下有效更新最短路径。数据结构优化针对不同类型的图稀疏或密集选择合适的数据结构。例如对于密集图可以使用邻接矩阵来代替邻接表。 #include iostream #include vector #include queue #include climitsusing namespace std;const int MAX_V 1000; // 假设图中最多有1000个节点class Graph {int V; // 顶点数vectorvectorint adjMatrix; // 邻接矩阵public:Graph(int V) : V(V), adjMatrix(V, vectorint(V, INT_MAX)) {}void addEdge(int u, int v, int w) {adjMatrix[u][v] w;adjMatrix[v][u] w;}void updateEdge(int u, int v, int w) {adjMatrix[u][v] w;adjMatrix[v][u] w;}int shortestPath(int source, int destination) {vectorint dist(V, INT_MAX);vectorbool sptSet(V, false);dist[source] 0;for (int count 0; count V - 1; count) {int u minDistance(dist, sptSet);sptSet[u] true;for (int v 0; v V; v) {if (!sptSet[v] adjMatrix[u][v] ! INT_MAX dist[u] ! INT_MAX dist[u] adjMatrix[u][v] dist[v]) {dist[v] dist[u] adjMatrix[u][v];}}}return (dist[destination] INT_MAX) ? -1 : dist[destination];}private:int minDistance(const vectorint dist, const vectorbool sptSet) {int min INT_MAX, min_index;for (int v 0; v V; v) {if (!sptSet[v] dist[v] min) {min dist[v];min_index v;}}return min_index;} };int main() {// 示例用法int N, M, u, v, w;cin N M;Graph g(N);for (int i 0; i M; i) {cin u v w;g.addEdge(u, v, w);}// 处理查询// ... }这个实现针对密集图进行了优化但它不包括动态最短路径算法的实现。动态最短路径算法通常更复杂可能需要使用更高级的数据结构和算法技巧。这种算法的实现和优化通常是图算法研究的前沿话题。
http://www.hkea.cn/news/14584634/

相关文章:

  • 全国新农村建设中心网站有网打不开网页咋回事
  • 做网站优化如何遍文章深圳p2p网站建设
  • 开原网站制作公司cms 网站后台内容管理系统模板
  • 伊春网站推广华为vi设计手册ppt
  • 盐城网站优化推广工作室突发 佛山出大事
  • 网站建设的市场调研免费培训学校网站源码
  • 找个人给我做电影网站好北京网站建设哪家好
  • 网站建设公司的客户一级造价工程师
  • 什么网站可以接单做海报网站备案系统登录
  • 关于静态网站开发相关新闻seo课程哪个好
  • 自己设置免费网站设计平台外链网站分类
  • 广东购物网站建设价格台州品牌网站建设
  • 电子商务网站接口费率展厅公司
  • 公司网站建设详细方案淘宝客网站怎么做的人少了
  • 网站新闻被百度收录京东网站建设的详细策划
  • 上海做网站的公司有哪些东莞营销网站建设哪个平台好
  • 做视频大赛推广的网站南宁百度网站建设
  • 传统网站建设团队网页制作可以用手机吗
  • 高密 网站建设科技术语
  • 怎么建设自己产品网站南宁建站方案
  • 镇平微网站开发网页版式设计分析
  • 网站建设问题怎么设计logo图片
  • sns类网站有哪些手工艺品外贸公司网站建设方案
  • 网站建设商城 买模板成都市房产信息网
  • 建设部网站城建学院免费建立小程序网站
  • 如何使用模板建设网站扁平化设计网站 源码
  • 跨境电商平台网站做某个网站接口违法
  • 自己做章网站wordpress 恢复数据库 白屏
  • 宜昌网站建设宜昌windows10 wordpress
  • seo外贸仿牌网站换域名国内产品设计公司排名