求大佬教我结构体比较函数的重写
  • 板块题目总版
  • 楼主KMSK
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/11/8 21:19
  • 上次更新2023/11/4 01:04:25
查看原帖
求大佬教我结构体比较函数的重写
472423
KMSK楼主2021/11/8 21:19

在刷p4779单源最短路径的时候需要用到结构体比较函数 一般int 比较的小于号不就是:

bool cmp(int a,int b)
{
   return a<b;
}

因为我用的是Dijkstra的堆优化,所以要用到priority_queue的比较函数重写,就是在结构体里面重写运算符,代码如下

{
	int pos;//当前点编号
	long long d;//原点到这个点的当前最短距离
	bool operator<(const node nd)const
	{
		return nd.d<d;
	}
};

按照一般的不是应该以d为基准而不是以nd.d为基准而写成d<nd.d嘛,搞不懂...
完整代码如下:

#include<cstring>
#include<queue>
#include<vector> 
using namespace std;
int n,m,s;
int inf=2147483647;
struct edge//边 
{
	int  u;
	int v;
	int w;
}a[200005];
vector<edge>E[100005];//存储每个节点的相连节点(以存储节点实现) 
long long dis[100005];
int vis[100005];
struct node
{
	int pos;
	long long d;
	bool operator<(const node nd)const
	{
		return nd.d<d;
	}
};
priority_queue<node>q;
void dijkstra(int s)
{
	for(int i=1;i<=n;i++)
	dis[i]=inf;
	dis[s]=0;
	node n1;
	n1.pos=s;
	n1.d=0;
	q.push(n1);
	while(!q.empty())
	{
		node fn=q.top();
		q.pop();
		int x=fn.pos;
		//怎么快速求出与这个节点相连的节点
		if(vis[x])continue;
		vis[x]=1;
		for(int i=0;i<E[x].size();i++)
		{
			if(dis[E[x][i].v]>dis[x]+E[x][i].w)
			{
			dis[E[x][i].v]=dis[x]+E[x][i].w;
			node newd;
			newd.pos=E[x][i].v;
			newd.d=dis[E[x][i].v];
			q.push(newd);
		}
		 } 
	}
}
int main()
{
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++)
	{
	cin>>a[i].u>>a[i].v>>a[i].w;
	E[a[i].u].push_back(a[i]);
}
	dijkstra(s);
	for(int i=1;i<=n;i++)
	cout<<dis[i]<<" ";
	return 0;
}  

提交结果

2021/11/8 21:19
加载中...