在刷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;
}