已AC,但dij堆优化为什么跑不过SPFA,求大佬解读
  • 板块P1576 最小花费
  • 楼主Lamorak
  • 当前回复12
  • 已保存回复12
  • 发布时间2021/1/25 17:50
  • 上次更新2023/11/5 04:24:43
查看原帖
已AC,但dij堆优化为什么跑不过SPFA,求大佬解读
307826
Lamorak楼主2021/1/25 17:50

8个TLE的dij堆优化

#include<bits/stdc++.h>
using namespace std;
const int N=8000,M=800000;
int head[N],tot,n,m,vis[N];
double dis[N];
struct node{
	int v,next;
	double w;
}a[M];
priority_queue<pair<double,int>,vector<pair<double,int> >,greater<pair<double,int> > > q;
void add(int x,int y,double w){
	a[++tot].next=head[x];
	a[tot].v=y;
	a[tot].w=1.0-w/100.0;
	head[x]=tot;
}
void dijkstra(int x){
	dis[x]=1.0;
	vis[x]=1;
	q.push(make_pair(1.0,x));
	while(!q.empty()){
		int t=q.top().second;
		vis[t]=0;
		q.pop();
		for(int i=head[t];i!=-1;i=a[i].next){
			int v=a[i].v;double w=a[i].w;
			if(dis[v]<dis[t]*w){
				dis[v]=dis[t]*w;
				if(vis[v]==0){
					q.push(make_pair(dis[v],v));
					vis[v]=1;
				}
			}
		}
	}
}
signed main(){
	memset(dis,1000000000.0,sizeof(dis));
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int u,v;
		double w;
		scanf("%d%d%lf",&u,&v,&w);
		add(u,v,w);add(v,u,w);
	}
	int s,e;
	scanf("%d%d",&s,&e);
	dijkstra(s);
	double ans=100.0/dis[e];
	printf("%.8lf",ans);
	return 0;
}

AC的SPFA

#include<bits/stdc++.h>
using namespace std;
const int N=8000,M=800000;
int head[N],tot,n,m,vis[N];
double dis[N];
struct node{
	int v,next;
	double w;
}a[M];
queue<int> q;
void add(int x,int y,double w){
	a[++tot].next=head[x];
	a[tot].v=y;
	a[tot].w=1.0-w/100.0;
	head[x]=tot;
}
void dijkstra(int x){
	dis[x]=1.0;
	vis[x]=1;
	q.push(x);
	while(!q.empty()){
		int t=q.front();
		vis[t]=0;
		q.pop();
		for(int i=head[t];i!=-1;i=a[i].next){
			int v=a[i].v;double w=a[i].w;
			if(dis[v]<dis[t]*w){
				dis[v]=dis[t]*w;
				if(vis[v]==0){
					q.push(v);
					vis[v]=1;
				}
			}
		}
	}
}
signed main(){
	memset(dis,1000000000.0,sizeof(dis));
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int u,v;
		double w;
		scanf("%d%d%lf",&u,&v,&w);
		add(u,v,w);add(v,u,w);
	}
	int s,e;
	scanf("%d%d",&s,&e);
	dijkstra(s);
	double ans=100.0/dis[e];
	printf("%.8lf",ans);
	return 0;
}

十分疑惑

2021/1/25 17:50
加载中...