浅记一下
输入样例:
4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4
输出样例:
0 2 4 3
思路
利用优先队列和数组模拟邻接表实现,数组模拟链表实质上是利用头插法。
代码
#include <bits/stdc++.h>
#include <algorithm>
#define ll long long
#define pii pair<int, int>
#define inf 1e9
using namespace std;
const int N = 2e5+10;
const int mod = 1e9 + 7;
int t, n, m, s;
// 建立邻接表
int vis;
struct node{
int u, v, w, nex;
}idex[N];
int head[N];
bool vim[N/2];
ll dis[N/2];
void add(int a, int b, int w){
idex[++vis].u = a;
idex[vis].v = b;
idex[vis].w = w;
idex[vis].nex = head[a];
head[a] = vis;
}
// 迪杰斯特拉
priority_queue<pii,vector<pii>,greater<pii>>q;
void dijkstra(){
for(int i = 1;i <= n;i++)dis[i] = inf;
dis[s] = 0;
pii f = make_pair(0,s);
q.push(f);
while(!q.empty()){
int top = q.top().second;q.pop();
if(vim[top])continue;
vim[top] = true;
for(int i = head[top];i;i = idex[i].nex){
int ind = idex[i].v;
if(dis[ind] > dis[top]+idex[i].w){
dis[ind] = dis[top]+idex[i].w;
q.push(make_pair(dis[ind],ind));
}
}
}
}
void solve(){
cin>>n>>m>>s;
for(int i = 0;i < m;i++){
int a, b, c;
cin>>a>>b>>c;
add(a,b,c);
}
dijkstra();
for(int i = 1;i <= n;i++)cout<<dis[i]<<" ";
}
int main()
{
// cin>>t;
// while(t--)
solve();
return 0;
}