100分求调
查看原帖
100分求调
957880
PRabbitdad楼主2023/5/17 13:40
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
vector<int> G1[10005], G2[10005];
bool vis[10005], f[10005];
int dis[10005];
int n, m, s, t;
void dfs(int u) { // dfs反向图求是否能到t
    vis[u] = true;
    for (int i = 0; i < G2[u].size(); i++) {
        int v = G2[u][i];
        if (!vis[v]) {
            dfs(v);
        }
    }
} 
queue<int> q;
void bfs(int s) { // 求图上最短路 
    memset(dis, -1, sizeof(dis));
    dis[s] = 0;
    q.push(s);
    while (!q.empty()) {
        int now = q.front();
        q.pop();
        for (int i = 0; i < G1[now].size(); i++) {
            int v = G1[now][i];
            if (f[v] && dis[v] == -1) {
                dis[v] = dis[now] + 1;
                q.push(v);
            }
        }
    }
}
int main() {
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        G1[u].push_back(v);
        G2[v].push_back(u);
    }
    cin >> s >> t;
    dfs(t);
    for(int i=1;i<=n;i++){
        f[i] = true;
    }
    for(int i=1;i<=n;i++){  
        for(int j=0;j<G1[i].size();j++){
            int v = G1[i][j];
            if(!vis[v]){
                f[i] = false;
            }
        }
    }
    bfs(s);
    cout << dis[t] << endl;
    return 0;
}
2023/5/17 13:40
加载中...