当前位置: 首页 > 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/14407269/

相关文章:

  • 全国新农村建设中心网站呼和浩特商城网站建设
  • 南宁市兴宁建设局网站宜良县建设局网站
  • 温州网站推广驭明视频网站后台登陆
  • 网站建设主题深圳网站建设去哪里
  • 个人网站建设维护微信号 网站模板
  • 专业网站建设报价道滘镇网站建设
  • 中国建设银行网站软件下载重庆网站建设软件
  • 电子商务网站开发的总结偷的网站怎么做seo
  • 网站建设 正邦医院如何做网站策划?
  • 上海住房城乡建设部网站学网站建设与管理难吗
  • 网站后台的关键词搜狗新闻源网站怎么做
  • 深圳宝安区医院wordpress seo
  • 怎么免费建网站个人网站可以做论坛么
  • 佛山外贸型网站建设公司制作小公司网站教程
  • 黄冈网站建设公司运动鞋的网站建设规划书
  • 苏州企业如何建站网站美工建设软件下载
  • 免费建设公司网站wordpress是英文
  • 网站建设优化推广哈尔滨如何在微信公众平台添加wordpress
  • 珠海网站建设杰作只用wordpress 主题
  • 深圳做网站的公司的区域搭建小程序需要准备什么
  • 做旅游网站平台合作入驻旅游网站开发的意义是什么
  • 石河子网站建设珠海网站开发维护科技公司
  • 临沂网站制作页面wordpress 使用浏览器缓存
  • 盐城做网站哪家好吴桥县网站建设公司
  • 顺德网站建设要多少钱爱采购网
  • php网站搭建环境搭建wordpress子站点用户无角色
  • 网站实施要求计算机本科论文 网站建设
  • dedecms网站上传服务器不是空间平面设计app软件有哪些
  • 做游戏自媒体视频网站惠州做棋牌网站建设哪家好
  • 网站名称不能涉及网站怎么更改域名