📜  门| GATE CS 1999 |问题15(1)

📅  最后修改于: 2023-12-03 14:58:18.880000             🧑  作者: Mango

门 | GATE CS 1999 | 问题15

这道题目是GATE CS 1999考试中的一道题,考察了程序员在图论中的能力。题目描述如下:

在一个有向加权图中,给定一个源节点S和终点节点T,找到从S到T的最短路径,并计算其权重和。

以下为这个问题的解决思路和代码实现。

解决思路

由于需要求解最短路径,可以考虑使用Dijkstra算法。Dijkstra算法是一种贪心算法,从起点开始,每次选择与起点距离最小的一个节点进行扩展,并把该节点加入已访问的节点集合中。在扩展的过程中,不断更新最短路径和对应的权重。

具体地,可以使用一个dist数组来记录从源节点到其他节点的最短路径长度,初始dist[s]为0,其余为无穷大。同时,使用一个visited数组来记录节点是否已经访问过。对于每一个未访问的节点,不断从中选择dist值最小的,计算其可到达的未访问节点的距离,如果小于原来的距离,则更新dist值。为了实现这个功能,需要使用一个优先队列priority_queue来存储未访问的节点。

最后,当T节点被加入已访问的节点集合中时,dist[T]即为求解的最短路径长度。

代码实现

下面是C++语言实现Dijkstra算法的代码:

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

const int INF = 1e9;
typedef pair<int, int> P;

struct edge {
    int to, cost;
    edge(int to, int cost) {
        this->to = to;
        this->cost = cost;
    }
};

vector<edge> G[100]; //邻接表存储图
int dist[100]; //存储最短距离
bool visited[100]; //记录节点是否已访问

void dijkstra(int s) {
    priority_queue<P, vector<P>, greater<P>> que;
    fill(dist, dist + 100, INF);
    dist[s] = 0;
    que.push(P(0, s));
    while (!que.empty()) {
        P p = que.top();
        que.pop();
        int v = p.second;
        if (visited[v]) continue;
        visited[v] = true;
        for (int i = 0; i < G[v].size(); i++) {
            edge e = G[v][i];
            if (dist[e.to] > dist[v] + e.cost) {
                dist[e.to] = dist[v] + e.cost;
                que.push(P(dist[e.to], e.to));
            }
        }
    }
}

int main() {
    int n, m, s, t;
    cin >> n >> m >> s >> t;
    for (int i = 1; i <= n; i++) { G[i].clear(); }
    fill(visited, visited + 100, false);
    for (int i = 0; i < m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        G[u].push_back(edge(v, w));
        G[v].push_back(edge(u, w)); //加入反向边
    }
    dijkstra(s);
    cout << dist[t] << endl;
    return 0;
}
总结

这道题目从图论的角度考察了程序员的能力,要求掌握基本的最短路径算法和数据结构。对于求解最短路径的问题,Dijkstra算法是一种较为常见的解决方法,需要程序员掌握其基本原理及实现细节。