前向星优化Dijkstra样例 听取0声一片
查看原帖
前向星优化Dijkstra样例 听取0声一片
724966
YiBoRrui6楼主2023/1/14 17:01

rt 样例显示4个0

#include<bits/stdc++.h>
using namespace std;

int n, m, s;
int inf = 2147483647;
int h[20050], edgecnt;
long long dis[10050];
bool dict[10050];

struct Edge
{
	int to, w, next;
}edge[1000050];

void init()
{
	edgecnt = 0;
	for (int i = 0; i <= n; i++) h[i] = -1;
	for (int i = 1; i <= n; i++) dict[i] = 0;
}

void addegde(int u, int v, int w)
{
	edge[++edgecnt].to = v;
	edge[edgecnt].w = min(edge[edgecnt].w, w);
	edge[edgecnt].next = h[u];
	h[u] = edgecnt;
}

int main()
{
	scanf("%d%d%d", &n, &m, &s);
	init();
	int u, v, w;
	for (int i = 0; i <= m-1; i++)
	{
		scanf("%d%d%d", &u, &v, &w);
		addegde(u, v, w);
	}
	for (int i = 1; i <= n; i++) dis[i] = inf;
	dis[s] = 0;
	long long minn;
	int expa = s;
	while (!dict[expa])
	{
		dict[expa] = 1;
		for (int i = h[expa]; i != -1; i = edge[i].next)
		{
			if (!dict[edge[i].to] && dis[edge[i].to] > dis[expa]+edge[i].w)
				dis[edge[i].to] = dis[expa]+edge[i].w;
		}
		minn = inf;
		for (int i = 1; i <= n; i++)
		{
			if (dis[i] < minn && !dict[i])
			{
				minn = dis[i];
				expa = i;
			}
		}
	}
	for (int i = 1; i <= n; i++) printf("%lld ", dis[i]);
	return 0;
}

求解qwq

2023/1/14 17:01
加载中...