最短路
for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]); 传递闭包 for(int k=0;k<n;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) dp[i][j]|=dp[i][k]&dp[k][j]; or for(int i=0;i<n;i++) for(int j=0;j<n;j++) for(int k=0;k<n;k++) dp[i][j]=dp[i][k]|dp[k][j];
struct E{int v,w;}; bool operator <(E a,E b){return a.w>b.w;} vector<E>g[N]; void dij(int s) { for(int i=1;i<=n;i++)vis[i]=0,dis[i]=oo; priority_queue<E>dp; dis[s]=0; dp.push((E){s,0}); while(!dp.empty()) { E node=dp.top(); dp.pop(); int u=node.v; if(vis[u])continue; vis[u]=1; for(E e:g[u]) { if(!vis[e.v] and dis[e.v]>dis[u]+e.w) { dis[e.v]=dis[u]+e.w; dp.push((E){e.v,dis[e.v]}); } } } }
int dis[N]; bool vis[N]; void spfa(int s){ for(int i=1;i<N;i++)dis[i]=oo,vis[i]=true; dis[s]=0; queue<int>q; q.push(s); vis[s]=true; while(!q.empty()){ int u=q.front(); q.pop(); vis[u]=true; for(int i=head[u];~i;i=g[i].next){ int v=g[i].to; if(dis[u]+g[i].w<dis[v]){ dis[v]=dis[u]+g[i].w; if(vis[v])q.push(v),vis[v]=false; } } } }