样例过了,10分,求助
查看原帖
样例过了,10分,求助
474282
LGC071030楼主2021/7/24 19:43
#include <cstdio>
#include <cstring>
#include <queue>
#define min(a,b) a<b?a:b

using namespace std;

int n, m, s;
int dis[100005];
bool vis[100005];

struct egde {int nxt, y, w;}e[500005];
int ltp, lk[500005];

void ist(int x, int y, int w) {
	e[++ltp] = (egde) {lk[x], y, w}; lk[x] = ltp;
//	e[++ltp] = (egde) {lk[y], x, w}; lk[y] = ltp;
}

void dij() {
	priority_queue < pair < int, int > > q;
	
	memset(dis, 0x3f, sizeof (dis));
	
	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 = lk[u]; i; i = e[i].nxt) {
			
			int y = e[i].y;
			int w = e[i].w;
			
			if (dis[y] > dis[u] + w) {
				dis[y] = dis[u] + w;
				q.push(make_pair(dis[y], y));
			}
		}
	}
	
}

void inp() {
	int x, y, w;
	
	scanf("%d%d%d", &n, &m, &s);
	for (int i = 1; i <= m; ++ i) {
		scanf("%d%d%d", &x, &y, &w);
		ist(x, y, w);
	}
}

void print_1() {
	for (int i = 1; i <= n; ++ i) {
		if (dis[i] == 0x3f3f3f3f) printf("2147483647 ");
		else printf("%d ", dis[i]);
	}
}

int main() {
	inp();
	dij();
	print_1();
	return 0;
}
2021/7/24 19:43
加载中...