【经典模板】:PID341 / 星门跳跃
题目大意:从1到N有M条边,每条边距离z,求最短路
思路:dijkstra+priority_queue。本道题由于数据非常大,时间要求严,不能全部往队列里丢数据,可以在之前加个判断,本次距离是否减小,减小则往队里扔。此外由于优先队列每次都是选取最小距离,则此距离固定,则代表已访问,标记点下次访问到此点直接跳过。
注意:
1、加判断if(visit[u])和if(D[v]==-1 || D[v]>D[u]+cost);
#include<cstdio>
#include<queue>
#include<vector>
#include<string.h>
#define MAX 300001
using namespace std;
struct node
{
int v,c;//u->v cost=c;
node (){}
node(int x,int y){v=x;c=y;}
bool operator < (const node &A) const
{
if (c==A.c)
return v>A.v;
else return c>A.c;
}
};
vector<node>g[MAX];
bool visit[MAX];
int D[MAX];
int n,m;
void Dijkstra()
{
priority_queue<node>Q;
int i,u,v,cost;
node p;
memset(visit,0,sizeof(visit));
memset(D,-1,sizeof(D));
D[1]=0;
Q.push(node(1,D[1]));
while(!Q.empty())
{
p=Q.top();Q.pop();
u=p