133voidchange_key(ddd[M],intv,intw){
134d[v].w=w;
135inti=d[v].q;
136while(i>1&&d[h[i/2]].w>d[h[i]].w){
137swap(h[i],h[i/2]);
138swap(d[h[i]].q,d[h[i/2]].q);
139i=i/2;
140}
141}
142inlinevoidmin_heaphy(ddd[M],int*a,inti,ints){//s为堆大小
143intl=i*2,r=i*2+1;
144intminer=i;
145if(l<=s&&d[a[i]].w>d[a[l]].w)
146miner=l;
147elseminer=i;
148if(r<=s&&d[a[miner]].w>d[a[r]].w)
149miner=r;
150if(miner!=i){
151swap(a[i],a[miner]);
152swap(d[a[i]].q,d[a[miner]].q);
153min_heaphy(d,a,miner,s);
154}
155}
156inlinevoidinit(ddd[M],intn,ints){//初始化图和堆
157inti;
158hs=n;
159for(i=1;i<=n;i++){d[i].w=LIM;h[i]=d[i].q=i;}
160change_key(d,s,0);
161}
162inlinevoidrelax(ddd[M],intu,intv,intduv){
163if(d[v].w>d[u].w+duv)change_key(d,v,d[u].w+duv);
164}
165voiddijkstra(vector<node>g[M],ddd[M],intn,ints){//nis|V|&&sisthesource
166init(d,n,s);
167inti;
168while(hs!=0){
169intu=h[1];
170swap(h[1],h[hs]);
171swap(d[h[1]].q,d[h[hs]].q);
172hs--;
173min_heaphy(d,h,1,hs);
174for(i=0;i<g[u].size();i++)relax(d,u,g[u][i].v,g[u][i].w);
175}
176}