voidsolve(){ cin >> n; for (int i = 1; i <= n; i++) { int u, v, w; cin >> u >> v >> w; g[u][v] = w; // g[v][u] = w; } }
signedmain(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int t = 1; // cin >> t; while (t--) { solve(); } return0; }
邻接表存图
1 2 3 4 5 6 7 8 9 10 11 12 13 14
typedef pair<int, int> PII; int n, m; vector<vector<PII>> g;
voidsolve(){ cin >> n >> m; g.resize(n + 1); for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; g[u].push_back({v, w}); // g[v].push_back({u, w}); } }
// h存的是表头,e存的是每一个节点的值,ne存的是每一个节点的下一个节点的下标 int h[N], e[M], ne[M], idx;
// 插入一条 a -> b 的边 voidadd(int a, int b){ e[idx] = b; ne[idx] = h[a]; h[a] = idx++; } int n, m;
voidsolve(){ // 初始化 memset(h, -1, sizeof h); for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; add(u, v); } }
图的遍历
dfs遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
voiddfs(int u, vector<bool>& vis){ vis[u] = true; cout << u << " "; for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (!vis[v]) dfs(v, vis); } }
voiddfs(int u){ vis[u] = true; cout << u << " "; for (int i = h[u]; i != -1; i = ne[i]) { int v = e[i]; if (!vis[v]) dfs(v); } }
voidbfs(int x, vector<bool>& vis){ queue<int> q; q.push(x); vis[x] = true; while (!q.empty()) { int u = q.front(); cout << u << " "; q.pop(); for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (!vis[v]) { vis[v] = true; q.push(v); } } } }
voidbfs(int x){ queue<int> q; q.push(x); vis[x] = true; while (!q.empty()) { int u = q.front(); q.pop(); cout << u << ' '; for (int i = h[u]; i != -1; i = ne[i]) { int v = e[i]; if (!vis[v]) { vis[v] = true; q.push(v); } } } }
int n, m; vector<vector<int>> g; // d 数组存入度 vector<int> d; vector<int> ans;
voidbfs(){ queue<int> q; for (int i = 1; i <= n; i++) { if (d[i] == 0) { q.push(i); ans.push_back(i); } } while (!q.empty()) { int u = q.front(); q.pop(); for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; d[v]--; if (d[v] == 0) { q.push(v); ans.push_back(v); } } } if (ans.size() == n) { for (auto x : ans) { cout << x << ' '; } cout << endl; } else { cout << -1 << endl; } }
voidsolve(){ cin >> n >> m; g.resize(n + 1); d.assign(n + 1, 0); for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; g[u].push_back(v); d[v]++; } bfs(); }
#include<bits/stdc++.h> #define int long long usingnamespace std;
constint N = 1e5 + 10; int n, m; int ans[N];
vector<int> g[N];
voiddfs(int x, int d){ if (ans[x]) return; ans[x] = d; for (int i = 0; i < g[x].size(); i++) { dfs(g[x][i], d); } }
voidsolve(){ // 反向建边 // 从n -> 1, 较大的数可以到哪个数,那么这个数可以到的最大的数就是这个较大数 cin >> n >> m; for (int i = 1; i <= m; i++) { int u, v; cin >> u >> v; g[v].push_back(u); } for (int i = n; i >= 1; i--) dfs(i, i); for (int i = 1; i <= n; i++) cout << ans[i] << " "; cout << endl; }
signedmain(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int t = 1; // cin >> t; while (t--) { solve(); } return0; }