代码之家  ›  专栏  ›  技术社区  ›  Bob

BFS用映射C替换数组++

  •  0
  • Bob  · 技术社区  · 7 年前

    如何替换常用阵列 int playersStartPos[100] 使用 std::map 在BFS算法中?该算法查找所有两个顶点之间的最短路径。它可以工作,但在某些情况下,继续所有顶点需要1秒以上的时间。所以我必须更换这个回路 for (int j = 0; j < K; j++) { //BAAAADDDDDD 使用std::map并按键进行搜索。但它似乎效果更差(应该更好,我100%知道)。如何修改算法以使用std::map?。 非常感谢。

    **INPUT**
    7 3 
    1 1 
    2 0 2 
    2 1 4 
    1 4 
    3 2 3 5 
    2 4 6 
    1 5 
    0 3 6
    
    **OUTPUT**
    0 4 5 
    4 0 3 
    5 3 0 
    1 2
    
    #include <iostream>
    #include <stdio.h>
    
    #include <vector>
    #include <queue>
    #include <map>
    
    using namespace std;
    
    vector<vector<int>> adjList;
    int N = 0; //vertices quantity
    int K = 0; //players quantity
    int playersStartPos[100];
    int res[100][100];
    
    void read()
    {
        FILE* fp = fopen("input2.txt", "r");
        fscanf(fp, "%d", &N);
        fscanf(fp, "%d", &K);
    
        for (int i = 0; i < N; i++) {
            int size = 0;
            fscanf(fp, "%d", &size);
    
            vector<int> adjacency(size);
            for (int j = 0; j < size; j++) {
                int to = 0;
                fscanf(fp, "%d", &to);
                adjacency[j] = to;
            }
    
            adjList.push_back(adjacency);
        }
    
        for (int player = 0; player < K; player++) {
            int pos = 0;
            fscanf(fp, "%d", &pos);
    
            //cout << pos << " ";
            playersStartPos[player] = pos;
        }
    
        //fclose(fp);
    }
    
    int bfs(int start, int ind)
    {
        queue<int> q;
        vector<bool> used(N, 0);
        vector<int> path(N);
    
        q.push(start);
        used[start] = true;
        path[start] = -1;
    
        while (!q.empty()) {
    
            int currentVertex = q.front();
            q.pop();
    
            for (size_t i = 0; i < adjList[currentVertex].size(); ++i) {
                int to = adjList[currentVertex][i];
    
                if (!used[to]) {
    
                    path[to] = path[currentVertex] + 1;
    
                    used[to] = true;
                    q.push(to);
    
                    for (int j = 0; j < K; j++) { //BAAAADDDDDD
    
                        if (to == playersStartPos[j]) {
                            res[ind][j] = path[to] + 1;
                        }
                    }
                }
            }
        }
    
        return 0;
    }
    
    void find()
    {
        for (int i = 0; i < K; i++) {
            bfs(playersStartPos[i], i);
        }
    }
    
    void write()
    {
        int min = N;
        int one = 0;
        int two = 0;
    
        for (int i = 0; i < K; i++) {
            for (int j = 0; j < K; j++) {
    
                if (res[i][j] == 0) {
                    continue;
                }
    
                if (min > res[i][j]) {
                    min = res[i][j];
    
                    one = i;
                    two = j;
                }
            }
        }
    
        FILE* fp = fopen("output.txt", "w");
    
        for (int i = 0; i < K; i++) {
            for (int j = 0; j < K; j++) {
                fprintf(fp, "%d ", res[i][j]);
            }
            fprintf(fp, "%c", '\n');
        }
    
        fprintf(fp, "%d %d\n", one, two);
        //fclose(fp);
    }
    
    int main()
    {
        read();
    
        find();
    
        write();
    
        return 0;
    }
    

    使用地图更新

    #include <iostream>
    #include <stdio.h>
    
    #include <vector>
    #include <queue>
    #include <map>
    
    using namespace std;
    
    vector<vector<int>> adjList;
    int N = 0; //vertices quantity
    int K = 0; //players quantity
    map<int, int> playersStartPos;
    //int playersStartPos[100];
    int res[100][100];
    
    void read()
    {
        FILE* fp = fopen("input2.txt", "r");
        fscanf(fp, "%d", &N);
        fscanf(fp, "%d", &K);
    
        for (int i = 0; i < N; i++) {
            int size = 0;
            fscanf(fp, "%d", &size);
    
            vector<int> adjacency(size);
            for (int j = 0; j < size; j++) {
                int to = 0;
                fscanf(fp, "%d", &to);
                adjacency[j] = to;
            }
    
            adjList.push_back(adjacency);
        }
    
        for (int player = 0; player < K; player++) {
            int pos = 0;
            fscanf(fp, "%d", &pos);
    
            //cout << pos << " ";
            playersStartPos[player] = pos;
        }
    
        /*for (int i = 0; i < adjList.size(); i++) {
        cout << "From: " << i << " to: ";
    
        for (int j = 0; j < adjList[i].size(); j++) {
        cout << " " << adjList[i][j];
        }
    
        cout << endl;
        }*/
    
        //fclose(fp);
    }
    
    int bfs(int start, int ind)
    {
        queue<int> q;
        vector<int> used(N, 0);
        vector<int> path(N);
    
        q.push(start);
        used[start] = true;
        path[start] = -1;
    
        while (!q.empty()) {
    
            int currentVertex = q.front();
            q.pop();
    
            for (size_t i = 0; i < adjList[currentVertex].size(); ++i) {
                int to = adjList[currentVertex][i];
    
                if (!used[to]) {
    
                    path[to] = path[currentVertex] + 1;
    
                    used[to] = 1;
                    q.push(to);
    
                    for (int j = 0; j < K; j++) {
    
                        auto it = playersStartPos.find(j);
                        if (it == playersStartPos.end()) continue;
    
                        if (to == it->second) {
                        //if (to == playersStartPos[j]) {
    
                            //cout << path[to] + 1 << endl;
    
                            res[ind][it->first] = path[to] + 1;
                            //res[ind][j] = path[to] + 1;
    
                            //break;
                        }
                    }
                }
            }
        }
    
        return 0;
    }
    
    void find()
    {
        for (int i = 0; i < K; i++) {
            bfs(playersStartPos[i], i);
        }
    }
    
    void write()
    {
        int min = N;
        int one = 0;
        int two = 0;
    
        for (int i = 0; i < K; i++) {
            for (int j = 0; j < K; j++) {
    
                if (res[i][j] == 0) {
                    continue;
                }
    
                if (min > res[i][j]) {
                    min = res[i][j];
    
                    one = i;
                    two = j;
                }
            }
        }
    
        FILE* fp = fopen("output.txt", "w");
    
        for (int i = 0; i < K; i++) {
            for (int j = 0; j < K; j++) {
                fprintf(fp, "%d ", res[i][j]);
            }
            fprintf(fp, "%c", '\n');
        }
    
        fprintf(fp, "%d %d\n", one, two);
        //fclose(fp);
    }
    
    int main()
    {
        read();
    
        find();
    
        write();
    
        return 0;
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Bob    7 年前

    这就是解决方案

    #include <iostream>
    #include <stdio.h>
    
    #include <vector>
    #include <queue>
    #include <map>
    
    using namespace std;
    
    vector<vector<int>> adjList;
    int N = 0; //vertices quantity
    int K = 0; //players quantity
    map<int, int> playersStartPos;
    int res[100][100];
    
    void read()
    {
        FILE* fp = fopen("input.txt", "r");
        fscanf(fp, "%d", &N);
        fscanf(fp, "%d", &K);
    
        for (int i = 0; i < N; i++) {
            int size = 0;
            fscanf(fp, "%d", &size);
    
            vector<int> adjacency(size);
            for (int j = 0; j < size; j++) {
                int to = 0;
                fscanf(fp, "%d", &to);
                adjacency[j] = to;
            }
    
            adjList.push_back(adjacency);
        }
    
        for (int player = 0; player < K; player++) {
            int vertex = 0;
            fscanf(fp, "%d", &vertex);
            playersStartPos[vertex] = player;
        }
    
        fclose(fp);
    }
    
    int bfs(int start, int ind)
    {
        queue<int> q;
        vector<int> used(N, 0);
        vector<int> path(N);
    
        q.push(start);
        used[start] = true;
        path[start] = -1;
    
        while (!q.empty()) {
    
            int currentVertex = q.front();
            q.pop();
    
            for (size_t i = 0; i < adjList[currentVertex].size(); ++i) {
                int to = adjList[currentVertex][i];
    
                if (!used[to]) {
    
                    path[to] = path[currentVertex] + 1;
    
                    used[to] = 1;
                    q.push(to);
    
                    auto it = playersStartPos.find(to);
                    if (it == playersStartPos.end()) continue;
    
                    if (to == it->first) {
                        res[ind][it->second] = path[to] + 1;
                    }
                }
            }
        }
    
        return 0;
    }
    
    void find()
    {
        map<int, int>::iterator it;
        for (it = playersStartPos.begin(); it != playersStartPos.end(); it++) {
            bfs(it->first, it->second);
        }
    }
    
    void write()
    {
        int min = N;
        int one = 0;
        int two = 0;
    
        for (int i = 0; i < K; i++) {
            for (int j = 0; j < K; j++) {
    
                if (res[i][j] == 0) {
                    continue;
                }
    
                if (min > res[i][j]) {
                    min = res[i][j];
    
                    one = i;
                    two = j;
                }
            }
        }
    
        FILE* fp = fopen("output.txt", "w");
    
        for (int i = 0; i < K; i++) {
            for (int j = 0; j < K; j++) {
                fprintf(fp, "%d ", res[i][j]);
            }
            fprintf(fp, "%c", '\n');
        }
    
        fprintf(fp, "%d %d\n", one, two);
    
        fclose(fp);
    }
    
    int main()
    {
        read();
    
        find();
    
        write();
    
        return 0;
    }