
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;
}
}
}
}