(笔记)Dijkastra

New version

v1:

typedef long long LL;
typedef pair<LL,int> PII;
const int N=1e5+5,M=5e5+5;
const LL INF=1e16;
struct Node{int v,next,w,u;};

LL dis[N];
	
int head[N],idx;
Node adj[M<<1];
void ins(int x,int y,int z){
	adj[++idx].v=y;
	adj[idx].u=x;
	adj[idx].next=head[x];
	adj[idx].w=z;
	head[x]=idx;
}
void undo(){
	if(!idx)return ;
	head[adj[idx].u]=adj[idx].next;
	idx--;
}
void init(){
	idx=0;
	for(int i=1;i<=n+2;i++)
		head[i]=0;
}
	
priority_queue<PII,vector<PII>,greater<PII> >q;

void dijkstra(int st){
	for(int i=1;i<=n+2;i++)dis[i]=INF;
	dis[st]=0;q.push(make_pair(0,st));
	while(!q.empty()){
		int u=q.top().second;
		LL d=q.top().first;
		q.pop();
		for(int i=head[u];i;i=adj[i].next){
			int v=adj[i].v;
			int w=adj[i].w;
			if(d+w<dis[v])dis[v]=d+w,q.push(make_pair(dis[v],v));
		}
	}
}
int id[N];

v2:

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=1e6+5,INF=1e9;
int n,m,r,Q;
int head[N],idx;
struct Edge{
	int v,next;
}adj[N<<1];
void ins(int x,int y){
	adj[++idx].v=y;
	adj[idx].next=head[x];
	head[x]=idx;
}
int dis[N];
priority_queue<PII,vector<PII>,greater<PII> >q;
void dij(){
	for(int i=1;i<=n;i++)
		dis[i]=INF;
	dis[r]=0;
	q.push(make_pair(0,r));
	while(!q.empty()){
		int u=q.top().second;
		q.pop();
		for(int i=head[u];i;i=adj[i].next){
			int v=adj[i].v;
			if(dis[v]>dis[u]+1){
				dis[v]=dis[u]+1;
				q.push(make_pair(dis[v],v));
			}
		}
	}
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m>>r;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		ins(u,v);ins(v,u);
	}
	dij();
	return 0;
}

Old version

#include<bits/stdc++.h>
using namespace std;
typedef pair<long long,long long>PII;
const int N = 2000005;
struct node{
	long long v,w,next;
	node(){
		next=w=0;
	}
	node(long long a,long long b,long long c){
		v=a;w=b;next=c;
	}
};
node adj[N];
long long h[N],s;
long long idx=1;
long long dist[N];
bool st[N];
long long n,m;
void insert(long long x,long long y,long long z){
	adj[idx]=node(y,z,h[x] );
    h[x] = idx;
    idx++;
}
void dijkstra(){
    memset(dist, 0x3f3f3f3f, sizeof(dist));
    dist[s] = 0;
    priority_queue< PII, vector<PII>, greater<PII> > heap; // 定义一个小根堆
    heap.push({ 0, s }); // 这个顺序不能倒,pair排序时是先根据first,再根据second,这里显然要根据距离排序
    while (heap.size())
    { 
        PII k =  heap.top() ; // 取不在集合S中距离最短的点
        heap.pop();
        int ver = k.second;
        int distance = k.first;

        if (st[ver]) continue;
        st[ver] =  1 ;  //把该点加入集合S

        for (int i = h[ver]; i !=0; i = adj[i].next)//在点中依次找相连点
        {
            int j = adj[i].v; //取出和ver相连的点
            if (dist[j] > distance + adj[i].w)
            {
                dist[j] =  distance+adj[i].w;
                heap.push({dist[j],j});
			}
		}
	}
}
int main(){
	scanf("%lld%lld%lld",&n,&m,&s);//writing code 
	while(m--){
		long long x,y,c;
		scanf("%lld%lld%lld",&x,&y,&c);
		insert(x,y,c);
	}
	dijkstra();
	for(int i=1;i<=n;i++)printf("%lld ",dist[i]);//依次输出该点与其他点的最小相连路径	
}
posted @ 2025-04-24 14:55  TBSF_0207  阅读(20)  评论(0)    收藏  举报