//前向星struct node { int nxt; int val; int lst; node () {} node (int next, int value) : nxt(next), val(value) {}};struct headnode { int u; int val; headnode () {} headnode (int uu, int value) : u(uu), val(value) {} bool operator < (const headnode &a) const { return val > a.val; }}; // 用于优先队列而已。val是比较的值。dist[i]int dist[maxn];bool vis[maxn];node edge[maxn];int last[maxn]void Dij(){ memset(dist, 0x3f, sizeof(dist)); memset(vis, 0, sizeof(vis)); priority_queuepq; pq.push(headnode(1, 0)); dist[1] = 0; headnode now; while (!pq.empty()) { now = pq.top(); pq.pop(); if (vis[now.u]) continue; vis[now.u] = true; for (int i=last[now.u]; i!=-1; i=edge[i].lst) { if (dist[edge[i].nxt] > edge[i].val + dist[now.u]) { dist[edge[i].nxt] = edge[i].val + dist[now.u]; pq.push(headnode(edge[i].nxt, dist[edge[i].nxt])); } } }}