图论04

106. 岛屿的周长

#include <iostream>
#include <vector>
#include <queue>

using namespace std;
int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};

int bfs(vector<vector<int>> &grid, vector<vector<int>> &visit, int &x, int &y) {
    int z = 0;
    queue<pair<int, int>> que;
    que.push({x, y});
    visit[x][y] = 1;
    while(!que.empty()) {
        pair<int, int> cur = que.front(); que.pop();
        int curx = cur.first, cury = cur.second;
        int zc = 0;

        for (int i = 0; i < 4; i++) {
            int nx = curx + dir[i][0];
            int ny = cury + dir[i][1];
            if (nx < 0 || ny < 0 || nx >= grid.size() || ny >= grid[0].size())
            {
               zc++;
               continue;
            }
  
            if (grid[nx][ny] == 1 && !visit[nx][ny]) {
                que.push({nx, ny});
                visit[nx][ny] = 1;
            }    
            if (grid[nx][ny] == 0) {
                zc++;
            }
        }
       
        z += zc;
 
    }
    return z;
}

int main() {
    int n, m; 
    cin >> n >> m;

    vector<vector<int>> grid(n, vector<int>(m, 0));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> grid[i][j];
        }
    }
    int result = 0;
    vector<vector<int>> visit(n, vector<int>(m, 0));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (grid[i][j] == 1 && !visit[i][j]) {
                result = bfs(grid, visit, i, j);
                break;
            }
        }
    }
    cout << result;
    return 0;
}

110. 字符串接龙

#include <iostream>
#include <string>
#include <vector>
#include <unordered_set>
#include <unordered_map>
#include <queue>

using namespace std;

int main() {
    string beginStr, endStr;
    int n;
    string str;
    cin >> n;
    cin >> beginStr >> endStr;
    unordered_set<string> strList;
    unordered_map<string, int> strMap;
    for (int i = 0; i < n; i++) {
        cin >> str;
        strList.insert(str);
    }
    queue<string> que;
    que.push(beginStr);
    strMap.insert(pair<string, int>(beginStr, 1));
    while(!que.empty()) {
        string str = que.front(); que.pop();
        for (int i = 0; i < str.size(); i++) {
            string newStr = str;
            for (int j = 0; j < 26; j++) {
                newStr[i] = j + 'a';
                if (newStr == endStr) {

                    cout << strMap[str] + 1;
                    return 0;
                }
                if (strList.find(newStr) != strList.end() && strMap.find(newStr) == strMap.end()) {

                    strMap.insert(pair<string, int>(newStr, strMap[str] + 1));
                    que.push(newStr);
       
                }
            }
        }
        
    }
    cout << 0;
    return 0;
}

105. 有向图的完全联通

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

int main() {
    int n, k;
    cin >> n >> k;
    unordered_map<int,vector<int>> map;
    int sin, sout;
    for (int i = 0; i < k; i++) {
        cin >> sin >> sout;
        map[sin].push_back(sout);
    }
    vector<int> visit(n, 0);
    queue<int> que;
    que.push(1);
    visit[0] = 1;
    while(!que.empty()) {
        int curNum = que.front(); que.pop();
        if (map.find(curNum) != map.end()) {
            vector<int> curV = map[curNum];
            for (int i = 0; i < curV.size(); i++) {
                if (!visit[curV[i] - 1]) {
                    visit[curV[i] - 1] = 1;
                    que.push(curV[i]);
                }
            }
        }

    }
    for (int i = 0; i < visit.size(); i++) {
        if (visit[i] == 0) {
            cout << -1;
            return 0;
        }
    }
    cout << 1;
    return 0;
}
posted @ 2025-08-17 10:57  skyler886  阅读(5)  评论(0)    收藏  举报