图论_单源最短路模板

Flyod

int g[N][N]

for (int k = 1; k <= n; k ++ )
    for (int i = 1; i <= n; i ++ )
    for (int j = 1; j <= n; j ++ )
        g[i][j] = min(g[i][j],g[i][k]+g[k][j]);

SPFA

int h[N],w[M],ne[M],e[M],idx;
int dist[N];
int n,p,m;
bool st[N];

void add(int a,int b,int c)
{
    e[idx] = b,w[idx] = c,ne[idx] = h[a],h[a] = idx++;
}

int spfa(int s){
    memset(dist,0x3f,sizeof dist);
    dist[s] = 0;
    
    queue<int> q;
    st[s] = 1;
    q.push(s);
    
    while(q.size())
    {
        int t = q.front(); q.pop();
        st[t] = 0;
        for(int i = h[t];~i;i = ne[i])
        {
            int j = e[i];
            if(dist[j]>dist[t]+w[i])
            {
                dist[j]=dist[t]+w[i];
                if(!st[j])
                {
                    q.push(j);
                    st[j] = 1;
                }
            }
        }
    }
}

dijkstra

int w[N][N],level[N];
int dist[N];
int n,p,m;
bool st[N];

void dijkstra()  
{
    memset(dist, 0x3f, sizeof dist);
    //memset(st, 0, sizeof st);
    dist[0] = 0;
    for(int i = 1;i<=n+1;i++)
    {
        int t = -1;

        for(int j = 0;j<=n;j++)
        if(!st[j]&&(t==-1 || dist[j] <dist[t] ))   // min connect 
            t = j;
        st[t] = 1;
        //cout<<t<<' ';
        for(int j = 1;j<=n;j++)
        dist[j] = min(dist[j],dist[t]+w[t][j]);   //renew connect to t
    }

}

posted @ 2022-04-04 18:49  InsiApple  阅读(24)  评论(0编辑  收藏  举报