Luogu P1339 热浪Heat Wave

Luogu P1339 热浪Heat Wave

裸·单源最短路。
但是!
有以下坑点:

  1. 算过复杂度发现Floyd跑不过去就不要用了。
  2. 如果建边是双向边,边的数组大小要开两倍!
  3. 考场上如果再把初始化的$dis[i]=INF$写成$dis[n]=INF$,或者忘记$dis[s]=0$之类的话,就直接火葬场了……
#include<bits/stdc++.h>
#define N 2510
#define M 6210
#define INF 0x3f3f3f3f

using namespace std;

int n,m,s,e,cnt;
int head[M*2],dis[N];

struct node {
	int nxt,to,val;
	bool operator < (const node& rhs) const {
		return rhs.val<val;
	}
}edge[M*2];

struct headnode {
	int u,d;
	bool operator < (const headnode& rhs) const {
		return rhs.d<d;
	}
};

void addEdge(int u,int v,int w) {
	edge[++cnt]=(node){head[u],v,w};
	head[u]=cnt;
	return;
}

void Read() {
	scanf("%d%d%d%d",&n,&m,&s,&e);
	for(int i=1;i<=m;i++) {
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		addEdge(u,v,w);
		addEdge(v,u,w);
	}
	return;
}

void Init() {
	for(int i=1;i<=n;i++) {
		dis[i]=INF;
	}
	dis[s]=0;
	return;
}

void Dijkstra() {
	priority_queue <headnode> q;
	q.push((headnode){s,dis[s]});
	while(!q.empty()) {
		headnode x=q.top();
		q.pop();
		int u=x.u;
		if(x.d<dis[u]) {
			continue;
		}
		for(int i=head[u];i;i=edge[i].nxt) {
			int v=edge[i].to,w=edge[i].val;
			if(dis[u]+w<dis[v]) {
				dis[v]=dis[u]+w;
				q.push((headnode){v,dis[v]});
			}
		}
	}
	return;
}

void Print() {
	printf("%d",dis[e]);
	return;
}

int main()
{
	Read();
	Init();
	Dijkstra();
	Print();
	return 0;
}
原文地址:https://www.cnblogs.com/luoshui-tianyi/p/11688702.html