boolfind_edge(int u, int v){ for (int i = 1; i <= m; ++i) { if (e[i].u == u && e[i].v == v) { returntrue; } } returnfalse; }
intmain(){ cin >> n >> m; vis.resize(n + 1, false); e.resize(m + 1); for (int i = 1; i <= m; ++i) cin >> e[i].u >> e[i].v; return0; }
邻接矩阵
使用一个二维数组 adj 来存边,其中 adj[u][v] 为 1 表示存在 u 到 v 的边,为 0 表示不存在。如果是带边权的图,可以在 adj[u][v] 中存储 u 到 v 的边的边权。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
int n, m; vector<bool> vis; vector<vector<bool> > adj;
boolfind_edge(int u, int v){ return adj[u][v]; } intmain(){ cin >> n >> m; vis.resize(n + 1, false); adj.resize(n + 1, vector<bool>(n + 1, false)); for (int i = 1; i <= m; ++i) { int u, v; cin >> u >> v; adj[u][v] = true; } return0; }
voidbfs(int u){ while (!Q.empty()) Q.pop(); Q.push(u); vis[u] = 1; d[u] = 0; p[u] = -1; while (!Q.empty()) { u = Q.front(); Q.pop(); for (int i = head[u]; i; i = e[i].nxt) { if (!vis[e[i].to]) { Q.push(e[i].to); vis[e[i].to] = 1; d[e[i].to] = d[u] + 1; p[e[i].to] = u; } } } }
voidrestore(int x){ vector<int> res; for (int v = x; v != -1; v = p[v]) { res.push_back(v); } std::reverse(res.begin(), res.end()); for (int i = 0; i < res.size(); ++i) printf("%d", res[i]); puts(""); }