vector<Edge> edges[MAXN]; inlinevoidadd(int from, int to, int w) { Edge e = {to, w}; edges[from].push_back(e); } // 无向图调用两次add即可 // vector的size方法可以返回其包含的元素个数 用于遍历 for (int i = 0; i < edges[2].size(); i++); //或者range-base for for (auto &&e: edges[2])
链式前向星
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
structEdge { int to, w, next; }; int head[MAXN], cnt; inlinevoidadd(int from, int to, int w) { edges[++cnt].w = w; // 新增一条边为cnt + 1的边 边权w edges[cnt].to = to; // 该边的终点为to edges[cnt].next = head[from]; // 把下一条边 设置为当前起点的第一条边 head[from] = cnt; // 最后两步相当于一个头插 会把新元素插到最前面而不是最后面 }
n, m, s = map(int,input().split()) head = [0] * (n + 1) cnt = 0 INF = 2 ** 31 - 1 ans = [INF] * (n + 1) vis = [False] * (n + 1) edge = {}
for i inrange(1, n + 1): edge[i] = INF
# 初始化到s点的距离为0 ans[s] = 0
for i inrange(1, m + 1): a, b, c = map(int, input().split()) # 重边取最小 if a in edge: edge[a][b] = min(edge[a].get(b, INF), c) else: edge[a] = {b:c} pos = s
# pos 未遍历时 whilenot vis[pos]: minn = INF # 标记 vis[pos] = True # pos 顶点在边上时 if pos in edge: # 取pos顶点指向的顶点(设为终点(有向图))和权值 for to, wei in edge[pos].items(): # 如果终点未访问并且终点的值大于pos+wei 那就更新终点值的最短路 ifnot vis[to] and ans[to] > ans[pos] + wei: ans[to] = ans[pos] + wei # 遍历所有未遍历的点 如果小于minn 就更新minn(最短路) 并且让pos = i(最短子路) for i inrange(1, n + 1): ifnot vis[i] and ans[i] < minn: minn = ans[i] for i inrange(1, n + 1): print(ans[i],end=' ')
structPolar { int dist, id; Polar(int dist, int id) : dist(dist), id(id){} };
structcmp { booloperator()(Polar a, Polar b) { return a.dist > b.dist; //这里是大于 使得距离短的先出队 } }; priority_queue<Polar, vector<Polar>, cmp> q;
voidDijkstra(int s) { dist[s] = 0; q.push(Polar(0, s)); while (!q.empty()) { int p = q.top().id; q.pop(); if (vis[p]) continue; vis[p] = 1; for (int e = head[p]; e != 0; e = edge[e].next) { int to = edges[e].to; dist[to] = min(dist[to], dist[p] + edges[e].w); if (!vis[to]) q.push(Polar(dist[to], to)); } } }
structedge { int v, w; }; vector<vector<edge>>e(MAXN); int dis[MAXN]; constint inf = 0x3f3f3f3f;
boolbellman(int n, int s) { memset(dis, 0x3f, sizeof(dist)); dis[s] = 0; bool flag = false;
for (int i = 1; i <= n; i++) { flag = false; for (int u = 1; u <= n; u++) { if (dis[u] == inf) continue; for (auto &x : e[u]) { int v = x.v, w = x.w; if (dis[v] > dis[u] + w) { dis[v] = dis[u] + w; flag = true; } } } if (!flag) break; } return flag; }
# Kahn算法 from collection import deque N = 100000 e = [[0] * N for _ inrange(N)] tp = [] din = [0] * N
# 每次从队列取出 让他所有出边减一 当某点入度为0时加入队列 如果最后队列长n则有拓扑序 否则有环 deftoposort(n): queue = deque() for i inrange(1, n + 1): if din[i] == 0: queue.append(i) while queue: x = queue.popleft() tp.append(x) for y in e[x]: din[y] -= 1 if din[y] == 0: queue.append(y) returnlen(tp) == n
n, m = map(int, input().split()) for i inrange(m): a, b = map(int,input().split()) e[a].append(b) din[b] += 1
ifnot toposort(n): print(-1) else: for x in tp: print(x,end=' ')
int ans = 0, cnt = 0; int n, m; constint N = 100010; structedge { int u, v, w; booloperator < (const edge& t)const { return w < t.w; } }e[N]; int fa[N]; intfind(int x) { if (x == fa[x]) return x; return fa[x] = find(fa[x]); } boolkruskal() { sort(e, e + m); for (int i = 0; i <= n; i++)p[i] = i; for (int i = 0; i < n; i++) { int x = find(e[i].v); int y = find(e[i].u); if(x != y) { fa[x] = y; ans += e[i].w; cnt++; } } return cnt == n - 1; }