普里斯(please) 和哎呦普(help) 米(me)
  • 板块学术版
  • 楼主Base_ring_tree
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/7/15 08:05
  • 上次更新2024/7/15 09:44:23
查看原帖
普里斯(please) 和哎呦普(help) 米(me)
950498
Base_ring_tree楼主2024/7/15 08:05
#include <bits/stdc++.h>

using namespace std;

#define TRACE 1
#define tcout TRACE && cout

#define int long long
const int maxn = 1e5+10;
const int maxm = 2e5+10;
const int INF = (1<<31)-1; 
int head[maxm], vis[maxn]; 
long long dis[maxn]; 
int aaa[maxn];
int n, m, k, tot=0;
struct node 
{
	 int to, nxt, d;
}edge[maxm];
struct point{
	int dd,p;
	bool operator<(const point & x) const{
		return dd>x.dd;
	}
};
void add(int x, int y, int z) 
{
	 edge[tot].to = y;
	 edge[tot].d = z; 
	 edge[tot].nxt = head[x]; 
	 head[x] = tot++;
 }
void dijkstra()
{
	for(int i=1;i<=n;i++)
	{
		dis[i]=INF;
	}
	dis[k]=0;
	memset(vis,0,sizeof(vis));
	priority_queue<point> q;
	point a;
	a.dd=0;
	a.p=k;
	q.push(a);
	while(!q.empty())
	{
		a=q.top();
		q.pop();
		int x=a.p;
		if(vis[x]) continue;
		vis[x]=1;  
		for(int i=head[x];i!=-1;i=edge[i].nxt)
		{
		
			int y=edge[i].to;
			
			if(dis[y] > dis[x] + edge[i].d +aaa[y]) 
			{  
				dis[y] = dis[x] +  edge[i].d +aaa[y];
				 a.dd = dis[y]; a.p = y;
				  q.push(a);
			 }
			
		}
		
	}
 
}
signed main()
{
	cin>>n>>m;
	memset(head,-1,sizeof(head));
	for(int i=1;i<=n;i++)
	{
		cin>>aaa[i];
	}
    for(int i=1;i<=m;i++)
    {
    	int u,v,w;
    	cin>>u>>v>>w;
    	add(u,v,w);
	}
	k=1; 
	dijkstra();
	for(int i=2;i<=n;i++)
	{
		cout<<dis[i]+aaa[1]<<" ";
	}
	
	return 0;
}

这是上次ABC的D,求调

2024/7/15 08:05
加载中...