usingnamespace std; constint N = 100010; vector<int>graph[N]; int n, m; bool vis[N];
voiddfs(int x) { vis[x] = true; cout << x << " "; for (int i = 0; i < graph[x].size(); i++) { if (!vis[graph[x][i]]) { dfs(graph[x][i]); } } }
voidbfs(int x) { queue<int>q; q.push(x); vis[x] = 1; while (!q.empty()) { int a = q.front(); q.pop(); cout << a << " "; for (int i = 0; i < graph[a].size();i++) { if (!vis[graph[a][i]]) { vis[graph[a][i]] = true; q.push(graph[a][i]); } } } }
intmain() { cin >> n >> m; for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; graph[a].emplace_back(b); } for (int i = 1; i <= n; i++) sort(graph[i].begin(), graph[i].end());
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> usingnamespace std; constint N = 100010; vector<int>fgraph[N]; int dis[N] = { 0 };
voiddfs(int x, int d) { if (dis[x] != 0) return; dis[x] = d; for (int i = 0; i < fgraph[x].size(); i++) { dfs(fgraph[x][i], d); } }
intmain() { int n, m; cin >> n >> m; while (m--) { int u, v; cin >> u >> v; fgraph[v].push_back(u); } for (int i = n; i >= 0; i--) { dfs(i, i); } for (int i = 1; i <= n; i++) { cout << dis[i] << " "; } }
#include <bits/stdc++.h> using namespace std; const int N = 500500;
vector<int>graph[N]; int deg[N]; int f[N]; int t[N]; int main() { int n; cin >> n; for(int i = 1; i <= n; i++) { int u, v; cin >> u >> t[i]; while (cin >> v && v) { graph[v].push_back(u); deg[u]++; } } queue<int>q; for (int i = 1; i <= n; i++) { if (deg[i] == 0) { q.push(i); f[i] = t[i]; } } while (!q.empty()) { int x = q.front(); q.pop();
for (int i = 0; i < graph[x].size(); i++) { int u = graph[x][i]; deg[u]--; if (deg[u] == 0) { q.push(u); } f[u] = max(f[u], f[x] + t[u]); } } int ans = 0; for (int i = 1; i <= n; i++) { ans = max(ans, f[i]); } cout << ans << endl; }
#define _CRT_SECURE_NO_WARNINGS #include<bits/stdc++.h> usingnamespace std; constint N = 100010; constint mod = 80112002; vector<int>graph[N]; int deg[N], out[N], nums[N]; intmain() { int n, m; cin >> n >> m; int a, b;
while (m--) { cin >> a >> b; graph[a].push_back(b); deg[b]++; out[a]++; } queue<int>q;
for (int i = 1; i <= n; i++) { if (deg[i] == 0) { q.push(i); nums[i] = 1; } }
while (!q.empty()) { int x = q.front(); q.pop(); for (int i = 0; i < graph[x].size(); i++) { int u = graph[x][i]; deg[u]--; if (deg[u] == 0) { q.push(u); } nums[u] = (nums[u] + nums[x]) % mod; }
} longlong ans = 0; for (int i = 1; i <= n; i++) { if (out[i] == 0) { ans = (nums[i] + ans)%mod; } } cout << ans; }
#define _CRT_SECURE_NO_WARNINGS #include<bits/stdc++.h> usingnamespace std; constint N = 1010; int n, m, k; int a[N], vis[N], all[N]; vector<int>graph[N];
voiddfs(int x) { if (vis[x] != 0) return; vis[x] = 1; all[x] += 1; for (int i = 0; i < graph[x].size(); i++) { int y = graph[x][i]; if (vis[y] == 0) dfs(y); } }
intmain() { cin >> k >> n >> m; for (int i = 1; i <= k; i++) cin >> a[i]; for (int i = 1; i <= m; i++) { int a, b; cin >> a >> b; graph[a].push_back(b); } for (int i = 1; i <= k; i++) { dfs(a[i]); memset(vis, 0, sizeof vis); } int ans = 0; for (int i = 1; i <= n; i++) { if (all[i] == k) ans += 1; } cout << ans; }
#define _CRT_SECURE_NO_WARNINGS #include<bits/stdc++.h> usingnamespace std; int m, n, sx, sy, dx[4] = { 0,1,0,-1 }, dy[4] = { 1,0,-1,0 }, ans = 0; constint N = 1510; bool graph[N][N] = { false }; int vis[N][N][3] = { 0 }; voiddfs(int x, int y, int lx, int ly) { if (vis[lx][ly][2] && (vis[lx][ly][0] != x || vis[lx][ly][1] != y)) { ans = 1; return; }
if (vis[lx][ly][2] && vis[lx][ly][0] == x && vis[lx][ly][1] == y)return; vis[lx][ly][0] = x; vis[lx][ly][1] = y; vis[lx][ly][2] = 1; int nx, ny; for (int w = 0; w < 4; w++) { nx = (lx + dx[w] + n) % n; ny = (ly + dy[w] + m) % m; if (graph[nx][ny])dfs(x + dx[w], y + dy[w], nx, ny); }
} intmain() { char c; while (cin >> n >> m) { memset(vis, false, sizeof(vis)); memset(graph, false, sizeof(graph)); ans = 0;
for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> c; if (c == '.')graph[i][j] = true; elseif (c == 'S') { sx = i, sy = j; graph[i][j] = true; } else graph[i][j] = false; } } dfs(sx, sy, sx, sy); if (ans)puts("Yes"); elseputs("No"); } }
""" dfs 深搜找环 用三色标记法,未访问为0,还处于递归栈中或在环上为1,搜素完毕是安全结点为2 一开始全为0,开始搜索,搜到的0标记为1,当搜索到的是1,说明遇到环了,此时退出。当没有搜到环 在退出dfs前,将标记改为2,表示安全 """ classSolution: defeventualSafeNodes(self, graph: List[List[int]]) -> List[int]: n = len(graph) color = [0] * n
defsafe(x: int)->bool: # 访问已经搜过的结点 1为有环 2为无环 if color[x] > 0: return color[x] == 2 # 如果是0 color[x] = 1 for y in graph[x]: # 快速退出 ifnot safe(y): returnFalse # 如果上面检测了都没有环 那么就说明该结点无环 标记为2并返回True color[x] = 2 returnTrue
return [i for i inrange(n) if safe(i)]
""" 拓扑排序 拓扑排序可以用来判环,如果一个结点没有出边那么就是安全的(终端)如果一个结点的出边连接的结点是安全的,那该结点也是安全的 那么可以把图的所有边反向,得到一个反图,再在反图上拓扑排序 循环结束后 所有入度为0的结点都是安全的 意思是,原图的出度为0的结点,和指向出度为0的结点的结点 (由于存了反图并拓扑排序 """ classSolution: defeventualSafeNodes(self, graph: List[List[int]]) -> List[int]: rg = [[] for _ in graph] # 如 graph[0] = [1,2] 0指向1 2反向: x = 0 ys = [1,2] 让1指向0 2 指向0 for x, ys inenumerate(graph): for y in ys: rg[y].append(x) # in_deg 表示入度 值为graph的每个数组的长度(即每个点的出度)(就是反图的入度) in_deg = [len(ys) for ys in graph]
q = deque([i for i, d inenumerate(in_deg) if d == 0]) while q: for x in rg[q.popleft()]: in_deg[x] -= 1 if in_deg[x] == 0: q.append(x) return [i for i, d inenumerate(in_deg) if d == 0]
# 其实就是双源bfs(边权为1 可以直接用单源的算法 初始化加上另一个源点) 并且每次只能交替走颜色不同的路 用邻接矩阵来储存图 储存点是否访问等 用点对 第二个参数表示颜色 classSolution: defshortestAlternatingPaths(self, n: int, redEdges: List[List[int]], blueEdges: List[List[int]]) -> List[int]: g = [[] for _ inrange(n)] for x, y in redEdges: g[x].append((y,0)) for x, y in blueEdges: g[x].append((y,1))
dis = [-1] * n vis = {(0,0),(0,1)} q = {(0,0),(0,1)} level = 0 while q: tmp = q q = [] for x, color in tmp: if dis[x] == -1: dis[x] = level for p in g[x]: if p[1] != color and p notin vis: vis.add(p) q.append(p) level += 1 return dis
classSolution: defnumOfMinutes(self, n: int, headID: int, manager: List[int], informTime: List[int]) -> int: g = collections.defaultdict(list) for i inrange(n): g[manager[i]].append(i)
q = collections.deque() q.append((headID, 0)) res = 0 while q: tid, val = q.popleft() iflen(g[tid]) == 0: res = max(res, val) else: for ne in g[tid]: q.append((ne, val + informTime[tid])) return res
# 这个题要找 到0的路线 先用defaultdict建图 正向记为1反向记为0 然后bfs classSolution: defminReorder(self, n: int, connections: List[List[int]]) -> int: res = 0 g = defaultdict(list) for a, b in connections: g[a].append((b, 1)) g[b].append((a, 0))
q = deque([0]) vis = [False] * n while q: cur = q.popleft() # 遍历所有和cur相邻的边 for end, dirction inrange(g[cur]): ifnot vis[end]: vis[end] = True # 如果方向不对就反转 res += dirction q.append(end) return res
# 或者 用set一次遍历 有点问题 classSolution: defminReorder(self, n: int, connections: List[List[int]]) -> int: s = {0} res = 0 for l, r in connection: if r in s: s.add(l) # 右边不通向0 并且左边通向0 (左边通向右边) 那就让r->l r就可以到0 elif l in s: s.add(r) res += 1 return res
# 两座相同的岛 先找到第一个不为0的数然后dfs标记这个岛的全部,然后用bfs搜索当第一次搜到第二个岛的step即是答案,注意dfs的时候要把第一个岛全部放入q(因为每个点都可能是距离第二个岛最近的点)搜完上下左右一圈后step + 1 (不需要vis数组记录 直接把走过的设为-1即可) classSolution: defshortestBridge(self, grid: List[List[int]]) -> int: defdfs(x, y): grid[x][y] = -1 q.append((x, y)) for nx, ny in (x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1): if0 <= nx < n and0 <= ny < n and grid[nx][ny] == 1: dfs(nx, ny)
n = len(grid) q = deque() i, j = next((i, j) for i inrange(n) for j inrange(n) if grid[i][j]) dfs(i, j) step = 0
whileTrue: for _ inrange(len(q)): x, y = q.popleft() for nx, ny in (x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1): if0 <= nx < n and0 <= ny < n : if grid[nx][ny] == 1: return step if grid[nx][ny] == 0: grid[nx][ny] = -1 q.append((nx, ny)) step += 1
word = [chr(i) for i inrange(97, 123)] q = deque([(beginWord, 1)]) while q: cur, step = q.popleft() for i, x inenumerate(cur): for y in word: if x != y: nxt = cur[:i] + y + cur[i + 1:] if nxt in wordList: if nxt == endWord: return step + 1 q.append((nxt, step + 1)) wordList.remove(nxt) return0
# 这个方法相当于是每次把step=1的所有数都找出来并且加进去 把所有step=2的都找出来加进去这样("hit","hot","dot" and "hit","hot","lot") 当q(内层)取完之后表示当前步数可以链接的下一个单词已经全部找到 可以step+1 然后把s中暂存的给q 再次循环 直到end 加入答案 (当内层q为0的时候表示所有路径都已经加进去 就直接return) 当q(外层)取完(也就是sq交换的时候s为[])之后表示所有路径都已经走过 但是还没有遇到end 这时返回[] # 首先 建图方面 建立这个单词可以变的其他单词 变化处用* 表示 用defaultdict后面可以快速访问 # 然后q用来存储当前值和当前路径 s与q相同 但是s是用来存储每轮的数据 每次开始时s都为[] (保证数据 相当于temp) classSolution: deffindLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[List[str]]: wordList = set(wordList) if endWord notin wordList: return [] dic = defaultdict(list) n = len(beginWord) for w in wordList: for i inrange(n): dic[w[:i] + '*' + w[i + 1:]].append(w)
q, s = [(beginWord, [beginWord])], [] res = [] vis = set() while q: while q: w, path = q.pop() vis.add(w) if w == endWord: res.append(path) for i inrange(n): for nxt in dic[w[:i] + '*' + w[i + 1:]]: if nxt notin vis: s.append((nxt, path + [nxt])) if res: return res q, s = s, q return []
# 多起点的最短路问题 可以将所有的0 看成同一个源点 然后使用bfs 因为每次扩散一轮 所有的都加一时候再扩散下一轮(队列 先进先出)每次只需要搜索四个方向 然后再原来的ret的基础上加一 classSolution: defupdateMatrix(self, mat: List[List[int]]) -> List[List[int]]: n, m = len(mat), len(mat[0]) ret = [[-1] * m for _ inrange(n)] dx = [0,1,0,-1] dy = [1,0,-1,0] q = deque() for i inrange(n): for j inrange(m): if mat[i][j] == 0: ret[i][j] = 0 q.append([i,j])
while q: i, j = q.popleft() for k inrange(4): ni, nj = i + dx[k], j + dy[k] if0 <= ni < n and0 <= nj < m and ret[ni][nj] == -1: ret[ni][nj] = ret[i][j] + 1 q.append([ni, nj])
defdfs_find_parent(node: TreeNode) -> None: if node isNone: return if node.left: node_parent[node.left] = node if node.right: node_parent[node.right] = node dfs_find_parent(node.left) dfs_find_parent(node.right)
dfs_find_parent(root) if k == 0: return [target.val] res = []
q = deque() vis = set() q.append(target) vis.add(target) # 现在依次遍历和target距离为level的结点(波纹法 一层层搜索) level = 0 while q and level < k: level += 1# 先加还是后加取决于level初值 for _ inrange(len(q)): x = q.popleft() for y in [node_parent[x] if x in node_parent elseNone, x.left, x.right]: # 遍历和当前点相邻的所有结点(每次搜索一层 注意要用set判重) if y and y notin vis: if level == k: res.append(y.val) q.append(y) vis.add(y) return res
classSolution: deffindTheCity(self, n: int, edges: List[List[int]], distanceThreshold: int) -> int: graph = [[inf] * n for _ inrange(n)] for a, b, w in edges: graph[a][b] = graph[b][a] = w for k inrange(n): for i inrange(n): for j inrange(n): graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])
ans = min_cnt = 0 for i inrange(n): cnt = 0 for j inrange(n): if j != i and graph[i][j] <= distanceThreshold: cnt += 1 if cnt <= min_cnt: min_cnt = cnt ans = i return ans
classSolution: defminimumTotalPrice(self, n: int, edges: List[List[int]], price: List[int], trips: List[List[int]]) -> int: g = [[] for _ inrange(n)] for a, b in edges: g[a].append(b) g[b].append(a) cnt = [0] * n for start, end in trips: defdfs(x:int, fa:int) -> bool: if x == end: cnt[x] += 1 returnTrue for y in g[x]: # dfs(y) 是为了说明这是可以到end的路(到end之后再往回更新cnt) if y != fa and dfs(y): cnt[x] += 1 returnTrue returnFalse dfs(start, -1)
# 现在就得到了走的边的次数 再加上已知点的权值 用树形DP求 defdfs(x:int, fa:int) -> (int, int): now_not_halve = price[x] * cnt[x] now_halve = price[x] * cnt[x] // 2 for y in g[x]: if y != fa: kid_not_halve, kid_halve = dfs(y, x) now_not_halve += min(kid_not_halve, kid_halve) now_halve += kid_not_halve return now_not_halve, now_halve returnmin(dfs(0, -1))
classSolution: defminimumEffortPath(self, heights: List[List[int]]) -> int: n, m = len(heights), len(heights[0]) l, r = 0, 10**6+10 defbfs(mid): dx = [0, 1, 0, -1] dy = [1, 0, -1, 0] q = deque() q.append((0, 0)) minn = maxn = heights[0][0] vis = [[False] * m for i inrange(n)] vis[0][0] = 1 while q: x, y = q.popleft()
for i inrange(4): nx = x + dx[i] ny = y + dy[i] if0 <= nx < n and0 <= ny < m andnot vis[nx][ny] andabs(heights[x][y] - heights[nx][ny]) <= mid: vis[nx][ny] = 1 q.append((nx, ny))
classSolution: defminimumEffortPath(self, heights: List[List[int]]) -> int: n, m = len(heights), len(heights[0]) deffind(x): if fa[x] == x: return x fa[x] = find(fa[x]) return fa[x] defunion(x, y): fa[find(x)] = find(y)
edgelen = [] fa = [i for i inrange(n * m)] for i inrange(n): for j inrange(m): pos = i * m + j if i < n - 1: edgelen.append([abs(heights[i + 1][j] - heights[i][j]), pos, pos + m]) if j < m - 1: edgelen.append([abs(heights[i][j + 1] - heights[i][j]), pos, pos + 1])
edgelen.sort() for e in edgelen: union(e[1], e[2]) if find(0) == find(m * n - 1): return e[0] return0
classSolution: defminimumEffortPath(self, heights: List[List[int]]) -> int: n, m = len(heights), len(heights[0]) q = [(0, 0, 0)] dis = [inf] * (m * n) dis[0] = 0 vis = set() dx = [0, 1, 0, -1] dy = [1, 0, -1, 0] while q: d, x, y = heapq.heappop(q) pos = x * m + y if pos in vis: continue if (x, y) == (n - 1, m - 1): break vis.add(pos)
for i inrange(4): nx = dx[i] + x ny = dy[i] + y if0 <= nx < n and0 <= ny < m andmax(d, abs(heights[x][y] - heights[nx][ny])) <= dis[nx * m + ny]: dis[nx * m + ny] = max(d, abs(heights[x][y] - heights[nx][ny])) heapq.heappush(q, (dis[nx * m + ny], nx, ny)) return dis[m * n - 1]
#include<bits/stdc++.h> usingnamespace std; constint N = 1e6 + 10; int n ; int w[N] , e[N] , ne[N] , h[N] , idx ; int maxu , maxd ; int dis[N]; voidadd(int a , int b , int c ) { e[idx] = b , w[idx] = c , ne[idx] = h[a] , h[a] = idx ++ ; } voiddfs(int u , int fa , int d) { dis[u] = d; for(int i = h[u] ; i != -1 ; i = ne[i]) { int j = e[i]; if(j != fa) dfs(j,u,d + w[i]); } } intmain() { cin >> n ; memset(h,-1,sizeof h); for (int i = 0; i < n; i++) { int a , b , c ; scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } dfs(1,-1,0); for (int i = 1 ; i <= n; i++) { if (dis[maxu] < dis[i]) { maxu = i; maxd = dis[maxu]; } }