遍历图(dfs)

题目描述

给出N 个点,M 条边的有向图,对于每个点 v,求A(v) 表示从点 v出发,能到达的编号最大的点。

输入格式

第1 行,2 个整数 N,M。

接下来 M行,每行2个整数 Ui​,Vi​,表示边 (Ui​,Vi​)。点用 1,2,⋯,N编号。

输出格式

N 个整数 A(1),A(2),⋯,A(N)。

输入输出样例

输入 #1复制

4 3
1 2
2 4
4 3

输出 #1复制

4 4 3 4

说明/提示

• 对于60% 的数据, 1≤N.M≤ 10^3;

• 对于100% 的数据,  1≤N,M≤10^5 。

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;

#define MAXL 100010

int N, M, A[MAXL];
vector<int> G[MAXL]; //vector存图 

void dfs(int x, int d) {
	if(A[x]) return; //访问过 就是不为0 
	A[x] = d;
	for(int i=0; i<G[x].size(); i++)	
		dfs(G[x][i], d);
}		

int main() {
	int u, v;
	scanf("%d%d", &N, &M);
	for(int i=1; i<=M; i++) {
		scanf("%d%d", &u, &v);
		G[v].push_back(u); //反向建边 
	}
	for(int i=N; i; i--) 
	dfs(i, i); 
	for(int i=1; i<=N; i++) 
	printf("%d ", A[i]);
	printf("\n");
	return 0;
}

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是使用 Dijkstra 算法解最短路的 C++ 代码实现: ```c++ #include <iostream> #include <vector> #include <queue> #include <cstring> using namespace std; const int MAXN = 1005; const int INF = 0x3f3f3f3f; int n, m, s, t; vector<pair<int, int>> adj[MAXN]; int dist[MAXN]; bool vis[MAXN]; void dijkstra(int s) { memset(dist, INF, sizeof(dist)); memset(vis, false, sizeof(vis)); dist[s] = 0; priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; pq.push(make_pair(0, s)); while (!pq.empty()) { int u = pq.top().second; pq.pop(); if (vis[u]) continue; vis[u] = true; for (int i = 0; i < adj[u].size(); ++i) { int v = adj[u][i].first; int w = adj[u][i].second; if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; pq.push(make_pair(dist[v], v)); } } } } int main() { cin >> n >> m >> s >> t; for (int i = 1; i <= m; ++i) { int u, v, w; cin >> u >> v >> w; adj[u].push_back(make_pair(v, w)); adj[v].push_back(make_pair(u, w)); } dijkstra(s); cout << dist[t] << endl; return 0; } ``` 其中 adj[] 存储了邻接表,dist[] 存储了起每个的最短距离,vis[] 表示是否已经被访问过。优先队列 pq 存储了 (dis, u),表示到 u 的距离为 dis。在 dijkstra 函数中,先将起 s 的距离设为 0,其余的距离设为正无穷。然后将起 s 加入队列 pq,当队列不为空时,取出队首元素 (dis, u),如果 u 的距离已经被更新,直接跳过。否则,更新 u 的距离为 dis,并遍历 u 的所有邻接 v,如果起到 v 的距离可以被更新,将 (dis+cost(u, v), v) 加入队列 pq。最终返回 dist[t],即为起到 t 的最短路长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法编程张老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值