全RE求助
查看原帖
全RE求助
392036
lzjuniverse楼主2020/10/10 22:15
#include <iostream>
#include <stdio.h>
#include <string.h>
#define ll long long
#define ti tu[i].to
#define N 100010
using namespace std;

struct node{
	ll nex,to,w;
}tu[N];
ll head[N],n,m,s,tot,z[N],vis[N];

ll getMin()
{
	ll Min = N;
	for(ll i=1; i<=n; i++)
	{
		if(z[i]!=-1&&!vis[i])
		{
			if(z[i]<z[Min])Min = i;
		}
	}
	return Min;
}



void Dijikstra(ll k)
{
	ll Min;
	if(!vis[k])
	{
		vis[k] = 1;
		for(ll i=head[k]; i; i=tu[i].nex)
		{
			if(z[ti]==-1)z[ti] = z[k] + tu[i].w;
			else z[ti] = min(z[ti],z[k]+tu[i].w);
		}
		Min = getMin();
		if(Min!=N)Dijikstra(Min);
	}
}


void add_edge(ll u,ll v,ll w)
{
	tu[++tot].to = v;
	tu[tot].nex = head[u];
	tu[tot].w = w;
	head[u] = tot;
}

int main()
{
	cin >> n >> m >> s;
	memset(z,-1,sizeof(z));
	z[N] = 2147483647;
	for(ll i=0; i<m; i++)
	{
		ll u,v,w;
		cin >> u >> v >> w;
		add_edge(u,v,w);
	}
	z[s] = 0;
	Dijikstra(s);
	for(ll i=1; i<=n; i++)
	{
		if(z[i]!=-1)cout << z[i] << " ";
		else cout << 2147483647 << " ";
	}
	return 0;  	
}
2020/10/10 22:15
加载中...