关于堆优化的某已死算法
  • 板块学术版
  • 楼主HMP_Haoge
  • 当前回复27
  • 已保存回复27
  • 发布时间2020/10/15 17:21
  • 上次更新2023/11/5 10:43:30
查看原帖
关于堆优化的某已死算法
254036
HMP_Haoge楼主2020/10/15 17:21

好像经过堆优化它又活了

以下是码

#include<bits/stdc++.h>
using namespace std;
#define ri register int
#define MAXM 4000100
#define MAXN 1000100
#define INF 2147483647

struct node
{
	int from,to,dis;
} edge[MAXN];
int cnt,head[MAXM],n,m,s,dist[MAXN];
bool vis[MAXN];

inline void add(int from,int to,int dis)
{
	edge[++cnt].from=head[from];
	edge[cnt].dis=dis;
	edge[cnt].to=to;
	head[from]=cnt;
}
template <typename T> inline void read (T &x)
{
	x=0;
	int f=1;
	char c=getchar();
	for(; !isdigit(c); c=getchar()) if(c=='-') f=-1;
	for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+(c^48);
	if(f<0) x=-x;
}
template <typename T> inline void write(T x)
{
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
inline void SPFA(int s)
{
	priority_queue< pair< int,int > > q;
	q.push(make_pair(0,s));
	for(ri i=1;i<=n;++i)
	{
		dist[i]=INF;
	}
	dist[s]=0;
	vis[s]=1;
	while(!q.empty())
	{
		int now=q.top().second;
		q.pop();
		vis[now]=0;
		for(ri i=head[now]; i; i=edge[i].from)
		{
			int v=edge[i].to;
			if(dist[v]>dist[now]+edge[i].dis)
			{
				dist[v]=dist[now]+edge[i].dis;
				if(!vis[v])
				{
					q.push(make_pair(-dist[v],v));
					vis[v]=1;
				}
			}
		}
	}
}

int main()
{
	read(n);
	read(m);
	read(s);
	int u,v,t;
	for(ri i=1; i<=m; ++i)
	{
		read(u);
		read(v);
		read(t);
		add(u,v,t);
	}
	SPFA(s);
	for(ri i=1; i<=n; ++i)
	{
		write(dist[i]);
		putchar(' ');
	}
}

而且还进了最优解第三页。

这波怎么评价,考试的时候能放心写这个吗(不包括负环情况)

2020/10/15 17:21
加载中...