#dijkstra+堆優化#[nssl 1436] 賽艇表演

題目

在這裏插入圖片描述


解題思路

正常連邊。
對於權值,就與0連邊。
00開始跑一遍dijkstra+堆優化就可以了。


代碼

#include<cstdio>
#include<cstring>
#include<queue>
#define rr register 
#define ll long long
using namespace std;
const int N=400010; 
struct node{int y; ll z; int next;}a[N*2];
int head[N*2],n,m,tot; bool v[N]; ll d[N],w;
priority_queue<pair<int,ll> >q; 
void add(int x,int y,ll z){a[++tot]=(node){y,z,head[x]}; head[x]=tot;}
void dijkstra(int root){
	memset(d,0x3f,sizeof(d)); 
	memset(v,0,sizeof(v)); 
	d[root]=0; q.push(make_pair(0,root)); 
	while (q.size()){
		int x=q.top().second; q.pop();
		if (v[x]) continue; v[x]=1;  
		for (rr int i=head[x];i;i=a[i].next){
			int y=a[i].y; ll z=a[i].z; 
			if (d[y]>d[x]+z) {
				d[y]=d[x]+z; 
				q.push(make_pair(-d[y],y)); 
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&m); 
	for (rr int i=1;i<=m;i++){
	 	 int x,y; ll z; scanf("%d%d%lld",&x,&y,&z); 
		 add(x,y,2*z); add(y,x,2*z); 
	 } 
	for(rr int i=1;i<=n;i++) scanf("%lld",&w),add(0,i,w),add(i,0,w); 
	dijkstra(0); 
	for(rr int i=1;i<=n;i++) printf("%lld ",d[i]); 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章