用STL的优先队列实现了dijsktra的优化
#define inf 999999999
using namespace std;
const int maxn=1000010;
int dis[maxn];
int head[maxn];
int pnt[maxn];
int next[maxn];
int cost[maxn];
int vis[maxn];
int node,edgenum,edg;
//int start[maxn],end[maxn],wight[maxn];
struct edge
{
int v,w;
edge(int vv=0,int ww=0): v(vv),w(ww){}
bool operator < (const edge& r) const { return w>r.w; }
};
void init()
{
edgenum=0;
for(int i=0;i<maxn;i++)
{
head[i]=-1;
vis[i]=0;
dis[i]=inf;
}
}
void addedge(int u,int v,int w)
{
pnt[edgenum]=v;
cost[edgenum]=w;
next[edgenum]=head[u];
head[u]=edgenum++;
}
void dij(int start)
{
edge mv;
priority_queue<edge> que;
int pre=start;
vis[start]=1;
dis[start]=0;
que.push(edge(start,0));
for(int i=1;i<node;i++)
{
for(int j=head[pre];j!=-1;j=next[j])
{
int k=pnt[j];
if(vis[k]==0&&dis[k]>dis[pre]+cost[j])
{
dis[k]=dis[pre]+cost[j];
que.push(edge(k,dis[k]));
}
}
while(!que.empty()&&vis[que.top().v]==1)
que.pop();
if(que.empty())
break;
mv=que.top();
que.pop();
pre=mv.v;
vis[pre]=1;
}
}