专栏文章

最短路径

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minc70u1
此快照首次捕获于
2025/12/02 00:01
3 个月前
此快照最后确认于
2025/12/02 00:01
3 个月前
查看原文
Floyd(早期代码)
CPP
#include <bits/stdc++.h>
using namespace std;
const int LP = 4500 + 1;
const long long INF = 0x7ffffffff;
long long n ,m ,x ,y ,w ,e[LP][LP];
int main()
{
  //freopen("Floyd.in" ,"r" ,stdin);
  //freopen("Floyd.out" ,"r" ,stdin);
  cin >> n >> m;
  memset(e ,INF ,sizeof(e));
  for (int i=1; i<=n; i++)
    for (int j=1; j<=n; j++)
      if (i == j) e[i][j] = 0;
      else e[i][j] = INF;
  for (int i=1; i<=m; i++)
  {
    cin >> x >> y >> w;
    e[y][x] = e[x][y] = min(e[x][y] ,w);
  }
  for (int k=1; k<=n; k++)
    for (int i=1; i<=n; i++)
      for (int j=1; j<=n; j++)
        e[i][j] = min(e[i][j] ,e[i][k] + e[k][j]);
  for (int i=1; i<=n; i++)
  {
    for (int j=1; j<=n; j++)
    {
      printf("%d " ,e[i][j]);
    }
    printf("\n");
  }
  //fclose(stdin);
  //fclose(stdout);
  return 0;
}
Dijkstra
CPP
#include <bits/stdc++.h>
#define iosFast ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr)
#define Traverse(i, fa) for (int i = head[fa]; i; i = edge[i].next)
#define File(x) freopen(x".in", "r", stdin); freopen(x".out", "w", stdout)
#define int long long
#define endl "\n"
using namespace std;
const int N = 1e4 + 10;
const int M = 5e5 + 10;
const int INF = INT_MAX;

int head[N], dis[N], tot = 1, n, m, s; 
bool vis[N];
struct Edge {
  int to;
  int next;
  int val;
} edge[M];

void Dijkstra(int fa) {
  for (int i = 1; i <= n; i++) dis[i] = INF;
  dis[fa] = 0;
  int Min, v;
  for (int i = 1; i <= n - 1; i++) {
    Min = INF;
    v = 0;
    for (int j = 1; j <= n; j++)
      if (!vis[j] && dis[j] < Min) {
        Min = dis[j];
        v = j;
      }
    if (v == 0) break;
    vis[v] = 1;
    Traverse(j, v) {
      int u = edge[j].to;
      if (!vis[u] && dis[v] + edge[j].val < dis[u])
      	dis[u] = dis[v] + edge[j].val;
    }
  }
}

inline void add (int u, int v, int w) {
  edge[tot].to = v;
  edge[tot].val = w;
  edge[tot].next = head[u];
  head[u] = tot++;
}

signed main () {
  iosFast;
  cin >> n >> m >> s;
  for (int i = 1; i <= m; i++) {
    int u, v, w;
    cin >> u >> v >> w;
    add (u, v, w);
  }
  Dijkstra(s);
  for (int i = 1; i <= n; i++)
    cout << dis[i] << " ";
  return 0;
}
Bellman-Ford
CPP
#include <bits/stdc++.h>
#define iosFast ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr)
#define Traverse(i, fa) for (int i = head[fa]; i; i = edge[i].next)
#define File(x) freopen(x".in", "r", stdin); freopen(x".out", "w", stdout)
#define int long long
#define endl "\n"
using namespace std;
const int N = 1e4 + 10;
const int M = 5e5 + 10;
const int INF = INT_MAX;
int head[N];

struct Edge {
  int to, val;
  int next;
} edge[M];

inline void addedge(int u, int v, int w, int tot) {
  edge[tot].to = v;
  edge[tot].next = head[u];
  edge[tot].val = w;
  head[u] = tot;
}

int dis[N];
int n, m;

void BellmanFord(int s) {
	for (int i = 1; i <= n; i++) dis[i] = INF;
	dis[s] = 0;
	for (int i = 1; i <= n - 1; i++) {
		for (int j = 1; j <= n; j++) {
			if (dis[j] == INF) continue;
			Traverse(k, j) {
				if (edge[k].val != INF && dis[edge[k].to] > dis[j] + edge[k].val)
					dis[edge[k].to] = dis[j] + edge[k].val;
			}
		}
	}
}

signed main() {
  int s;
  cin >> n >> m >> s;
  for (int i = 1; i <= m; i++) {
    int u, v, w;
    cin >> u >> v >> w;
    addedge(u, v, w, i);
  }
  BellmanFord(s);
  for (int i = 1; i <= n; i++) cout << dis[i] << " ";
  return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...