社区讨论

重载错在哪?悬赏一关

P1491集合位置参与者 4已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@lo1623sb
此快照首次捕获于
2023/10/22 15:47
2 年前
此快照最后确认于
2023/11/02 15:23
2 年前
查看原帖
这题我用dij然后用优先队列存结构体的时候自己重载运算符和用优先队列来存pair结果不同,为啥?
CPP
struct node
{
	double dis;
	int pos;
	friend bool operator < (const node &x,const node &y)
	{
		return x.dis>y.dis;
	}
};
priority_queue<node>q;
const int inf=0x7fffffff;
int change[maxnode];
void dij(int s,int p)
{
	for(int i=1;i<=n;i++)
		d[i]=inf,vis[i]=0;
	d[s]=0;
	q.push(node{0,s});
	while(!q.empty())
	{
		int temppos=q.top().pos;
		q.pop();
		if(vis[temppos])
			continue;
		vis[temppos]=1;
		for(int i=head[temppos];i;i=line[i].pre)
		{
			if(p==-1 || pd(i,p))
			{
				int v=line[i].to;
				double w=line[i].w;
				if(d[v]>d[temppos]+w)
				{
					d[v]=d[temppos]+w;
					if(p==-1)
						change[v]=i;
					q.push(node{-d[v],v});
				}
			}
		}
	}
}
下面的是对的
CPP
priority_queue<pair<double,int> >q;
const int inf=0x7fffffff;
int change[maxnode];
void dij(int s,int p)
{
	for(int i=1;i<=n;i++)
		d[i]=inf,vis[i]=0;
	d[s]=0;
	q.push(make_pair(0,s));
	while(!q.empty())
	{
		int temppos=q.top().second;
		q.pop();
		if(vis[temppos])
			continue;
		vis[temppos]=1;
		for(int i=head[temppos];i;i=line[i].pre)
		{
			if(p==-1 || pd(i,p))
			{
				int v=line[i].to;
				double w=line[i].w;
				if(d[v]>d[temppos]+w)
				{
					d[v]=d[temppos]+w;
					if(p==-1)
						change[v]=i;
					q.push(make_pair(-d[v],v));
				}
			}
		}
	}
}

回复

9 条回复,欢迎继续交流。

正在加载回复...