stl可作为跳板
--- Rujia liu
struct Edge{
int x,y,val;
Edge(int x = 0, int y = 0, int val = 0) : x(x), y(y), val(val) {}
};//弧
//以下为vector版
int n,m,M,s;//M为总边数
vector<Edge> edges;// 边列表
vector<int> G[MAXN];// 每个节点出发的边的编号(从0开始
bool vis[MAXN];
int d[MAXN];//s 到各点距离
int p[MAXN];// 最短路上的一条边
void init(int n) {
for(int i = 0; i < n; i++) G[i].clear() ;
edges.clear() ;
}
void add_edge(int x, int y, int val) {
edges.push_back(Edge(x,y,val));//没有构造函数的写法
m = edges.size() ;
G[x].push_back(m-1);
}
void dijkstra (int s) {
priority_queue <node> q;
for(int i = 0; i < n; i++) d[i] = INF;
d[s] = 0;
memset(vis, 0, sizeof(vis));
q.push(node(s,0));
while(!q.empty() ) {
node tmp = q.top() ; q.pop() ;
int u = tmp.id ;
if(vis[u]) continue;
vis[u] = true;
for(int i = 0;i < G[u].size() ; i++) {
Edge& e = edges[ G[u][i] ];//引用不加也行
if(d[e.y] > d[u] + e.val ) {
d[e.y ] = d[u] + e.val ;
p[e.y ] = G[u][i];
q.push(node(e.y , d[e.y ])) ;
}
}
}
}