这题我用dij然后用优先队列存结构体的时候自己重载运算符和用优先队列来存pair结果不同,为啥?
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});
}
}
}
}
}
下面的是对的
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));
}
}
}
}
}