最短路模板(Dijkstra,SPFA,Floyd)

最短路模板

Dijkstra

const int maxn = 1e4 + 5;
const int inf = 0x3f3f3f3f;
struct node
{
    int v, w;
    bool operator<(const node &p) const
    {
        return w > p.w;
    }
} a[maxn];
vector<node> v[maxn];
bool vis[maxn];
int dis[maxn];
void dij(int k)
{
    memset(vis, true, sizeof(vis));
    memset(dis, inf, sizeof(dis));
    dis[k] = 0;
    priority_queue<node> q;
    q.push({k, dis[k]});
    while (!q.empty())
    {
        node p;
        p = q.top();
        q.pop();
        if (vis[p.v])
            continue;
        vis[p.v] = true;
        for (int i = 0; i < v[p.v].size(); i++)
        {
            node t = v[p.v][i];
            if (!vis[t.v] && dis[t.v] > dis[p.v] + t.w)
            {
                dis[t.v] = dis[p.v] + t.w;
                q.push({t.v, dis[t.v]});
            }
        }
    }
}

SPFA

const int maxn = 1e4 + 5;
const int inf = 0x3f3f3f3f;
struct node
{
    int v, w;
};
vector<node> v[maxn];
int dis[maxn];
bool inq[maxn];
void spfa(int k)
{
    memset(dis, inf, sizeof(dis));
    memset(inq, false, sizeof(inq));
    queue<int> q;
    q.push(k);
    inq[k] = true;
    dis[1] = 0;
    while (!q.empty())
    {
        int t = q.front();
        q.pop();
        inq[t] = false;
        for (int i = 0; i < v[t].size(); i++)
        {
            node p = v[t][i];
            if (dis[p.v] > dis[t] + p.w)
            {
                dis[p.v] = dis[t] + p.w;
                if (!inq[p.v])
                {
                    q.push(p.v);
                    inq[p.v] = true;
                }
            }
        }
    }
}

Floyd

const int maxn = 1e4 + 5;
const int inf = 0x3f3f3f3f;
int dis[maxn][maxn];
void Floyd(int n)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(i==j)
                dis[i][j]=0;
            else
                dis[i][j]=inf;
        }
    }
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
            }
        }
    }
}

 

 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值