比赛 板子大赛 评测结果 AAAAAA
题目名称 单源最短路 最终得分 100
用户昵称 zhm 运行时间 0.018 s
代码语言 C++ 内存使用 3.04 MiB
提交时间 2025-01-22 11:11:57
显示代码纯文本
#include <cstdio>
#include <queue>
using namespace std;

const int N = 100, M = 500;
int n, m, s;

int cnt, h[N+5], nxt[2*M+5], to[2*M+5], w[2*M+5];
int dis[N+5]; 

void add(int u, int v, int val)
{
    cnt++;
    to[cnt] = v;
    w[cnt] = val;
    nxt[cnt] = h[u];
    h[u] = cnt;
}

bool vis[N+5];
priority_queue<pair<int, int> > q;

int main(void)
{
	freopen("path.in", "r", stdin);
	freopen("path.out", "w", stdout);
	scanf("%d %d %d", &n, &m, &s);
	for (int i = 1; i <= m; i++) {
		int x, y, z;
		scanf("%d %d %d", &x, &y, &z);
		add(x, y, z);
		add(y, x, z);
	}
	for (int i = 1; i <= n; i++)
		dis[i] = 0x3fffffff;
	dis[s] = 0;
	
	q.push(make_pair(-0, s));
	
	while (!q.empty()) {
		int u = q.top().second;
		q.pop();
		if (vis[u]) continue;
		vis[u] = 1;
		for (int i = h[u]; i; i = nxt[i]) {
			int v = to[i];
			if (dis[v] > dis[u] + w[i]) {
			   dis[v] = dis[u] + w[i];
			   q.push(make_pair(-dis[v], v));
			}
		}
	}
	for (int i = 1; i <= n; i++)
		printf("%d ", dis[i]);
	putchar('\n');
	
	fclose(stdin);
	fclose(stdout);
	
    return 0;
}