关于邻接链表

大家好我又来讲存图了

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

所以这里我们统一使用$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 @ 2021-07-19 15:19  5k_sync_closer  阅读(2)  评论(0编辑  收藏  举报  来源