单源最短路的建图方式

博客探讨了在不同题目背景下如何应用单源最短路算法。内容包括使用堆优化的Dijkstra解决无向图问题,Floyd算法处理小规模数据,以及在有虚拟源点的情况下构建图来求解最短距离。还分析了各种情况下的时间复杂度。
摘要由CSDN通过智能技术生成
题目1:热浪
分析:

由题目可知,求的是两个点之间的最短距离,边权为正数且点数和边数属于同一量级,使用堆优化版的dijkstra进行求解即可。

这道题是无向图,我们建有向图能求解吗?

不能。 因为如果a 和 b有一条边, 我们只建一条有向边, 意味着 a能到b, b确不能到a, 如果输入时起点是b,终点是a,那么我们就到达不了a,答案出错。

关于能否只建有向图求解无向图的问题, 一定要证明,如果证明不出来,直接按题目要求建立无向图。

时间复杂度: O ( m ∗ l o g m ) O(m * log ^m) O(mlogm)
代码区:
#include<iostream>
#include<cstring>
#include<queue>

#define x first
#define y second

using namespace std;

const int N = 2510, M = 6210 * 2;

typedef pair<int, int> PII;

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

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

int dijkstra()
{
    memset(dist, 0x3f, sizeof dist);
    dist[be] = 0;
    priority_queue<PII, vector<PII>, greater<PII>> heap;
    heap.push({0, be});
    
    while(heap.size())
    {
        auto t = heap.top();
        heap.pop();
        
        int ver = t.y, distance = t.x;
        if(st[ver]) continue;
        st[ver] = true;
        
        for(int i = h[ver]; i != -1; i = ne[i])
        {
            int j = e[i];
            if(dist[j] > distance + w[i])
            {
                dist[j] = distance + w[i];
                heap.push({dist[j], j});
            }
        }
        
    }
    
    return dist[en];
}

int main()
{
    memset(h, -1, sizeof h);
    cin >> n >> m >> be >> en;
    
    while(m --)
    {
        int a, b, c;
        cin >> a >> b >> c;
        add(a, b, c);
        add(b, a, c);
    }
    
    cout << dijkstra();
    
    
    return 0;
}


题目2:信使
分析:

题目中说明了起点为1, 求1号点到其它点最短距离的最大值。我们可以使用单源最短路, 由于这道题的数据范围比较小,所以我们使用5个最短路算法的任意一个都行,挑个简单的写就行了。

时间复杂度: O ( n 3 )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值