模拟dijikstra选节点

#include<bits/stdc++.h>
using namespace std;
int dmin[1010];
int d[1010][1010];
bool isvis[1010] = { false };
vector<int> vl[1010];
int vn, ve;
int main() {
    cin >> vn >> ve;
    for (int i = 0; i < ve; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        d[a][b] = d[b][a] = c;
        vl[a].push_back(b);
        vl[b].push_back(a);
    }
    int test;
    cin >> test;
    for (int i = 0; i < test; i++) {
        vector<int> v;
        int flag = 0;
        for (int j = 0; j < vn; j++)
        {
            int a;
            cin >> a;
            v.push_back(a);
        }
        int allmin = 9999999;
        vector<int> s;                                                                    //记录当前集合,第一个元素无论如何都正确
        s.push_back(v[0]);
        fill(isvis, isvis + 1010, false);
        isvis[v[0]] = true;
        for (int i = 1; i < vn; i++) {                                                            //有n-1个元素需要判断,执行n-1次
            int min1 = 9999, u = -1;
            vector<int> res;
            for (int o = 0; o < s.size(); o++) {                                                 //找出当前集合中最近的所有点
                int now1 = s[o];
                for (int j = 0; j < vl[s[o]].size(); j++) {
                    int now2 = vl[now1][j];
                    if (d[now1][now2] < min1 && isvis[now2] == false) {
                        min1 = d[now1][now2];
                        res.clear();
                        res.push_back(now2);
                    }
                    else if (d[now1][now2] == min1 && isvis[now2] == false)
                        res.push_back(now2);
                }
            }
            int p;
            for (p = 0; p < res.size(); p++) {                                                //判断输入序列的当前元素是否匹配
                if (v[i] == res[p]) {
                    flag = 1;
                    isvis[v[i]] = true;
                    s.push_back(v[i]);
                    break;
                }
            }
            if (p == res.size()) flag = 0;
            if (flag == 0) {                                                     //只要有一个元素不满足,那么就直接say no
                cout << "No" << endl;
                break;
            }
        }
        if (flag == 1) cout << "Yes" << endl;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当然,我可以为您提供一个Dijkstra算法的模板。以下是一个使用C++实现的基本示例: ```cpp #include <iostream> #include <vector> #include <queue> #include <climits> using namespace std; // 定义图的邻接矩阵表示 #define INF INT_MAX typedef vector<vector<int>> Graph; vector<int> Dijkstra(const Graph& graph, int source) { int n = graph.size(); // 图中节点的数量 // 创建一个距离数组,并将所有距离初始化为无穷大 vector<int> dist(n, INF); dist[source] = 0; // 将源节点的距离初始化为0 // 创建一个优先级队列(最小堆)来保存当前最短路径的节点 priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; pq.push({0, source}); // 将源节点加入优先级队列 while (!pq.empty()) { int u = pq.top().second; // 当前最短路径的节点 pq.pop(); // 遍历当前节点的所有邻居 for (int v = 0; v < n; ++v) { // 如果存在一条边从u到v,并且通过u到达v的距离更短 if (graph[u][v] != 0 && dist[u] + graph[u][v] < dist[v]) { dist[v] = dist[u] + graph[u][v]; // 更新最短路径距离 pq.push({dist[v], v}); // 将邻居节点加入优先级队列 } } } return dist; // 返回源节点到各个节点的最短路径距离数组 } int main() { int n = 5; // 图中节点的数量 Graph graph(n, vector<int>(n, 0)); // 初始化图的邻接矩阵 // 添加图的边(示例) graph = 2; graph = 4; graph = 1; graph = 7; graph = 3; graph = 2; int source = 0; // 源节点 vector<int> shortestDistances = Dijkstra(graph, source); // 使用Dijkstra算法计算最短路径 // 输出源节点到各个节点的最短路径距离 cout << "Shortest distances from source node " << source << ":" << endl; for (int i = 0; i < n; ++i) { cout << "Node " << i << ": " << shortestDistances[i] << endl; } return 0; } ``` 这是一个简单的Dijkstra算法模板,用于计算从源节点到图中所有其他节点的最短路径距离。您可以根据自己的需要进行修改和扩展。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值