关于邻接链表
大家好我又来讲存图了
相信大家手写链表肯定方法都不一样
所以这里我们统一使用$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;
}