关于邻接链表

大家好我又来讲存图了

相信大家手写链表肯定方法都不一样

所以这里我们统一使用STL

邻接链表的基本思路就是给每一个点开一个链表

然后把与 i 点相连的点加入 i 点的链表中

问题来了:怎么存边权呢?

答:用结构体用pair!

把与 i 点相连的点加入 i 点的链表时,同时加入该点与 i 之间的边权

那么加点操作就很容易可以实现了

void add(int u, int v, int w)
{
    edge[u].push_back(make_pair(v, w)); //first为v点,second为边权
}

遍历一个点的出边也很容易了:

for(auto &i : edge[u])

c++11的偷懒小技巧

仍然是附赠dij:

#include <iostream>
#include <list>
#include <queue>
#include <utility>
#include <functional>
using namespace std;
list<pair<int, int> > edge[100001];int n, m, s, u, v, w, dis[100001], vis[100001];
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > q;
void add(int u, int v, int w)
{
    edge[u].push_back(make_pair(v, w));
}
int main()
{
    cin >> n >> m >> s;
    for(int i = 0;i < m;++i)
        cin >> u >> v >> w, add(u, v, w);
    for(int i = 1;i <= n;++i)
        dis[i] = 2147483647;
    dis[s] = 0;q.push(make_pair(0, s));
    while(!q.empty())
    {
        int u = q.top().second;q.pop();
        if(vis[u]) continue;
        vis[u] = 1;
        for(auto &i : edge[u])
            if(dis[i.first] > dis[u] + i.second)
            {
                dis[i.first] = dis[u] + i.second;
                q.push(make_pair(dis[i.first], i.first));
            }
    }
    for(int i = 1;i <= n;++i)
        cout << dis[i] << " ";
    return 0;
}
posted @   Jijidawang  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示