模板积累——Dijkstra算法

本文深入探讨了Dijkstra算法的原理与应用,通过详细解释其核心思想和步骤,为读者提供了清晰的理解路径。文章提供了两种实现方式:邻接矩阵和邻接表,并附有完整的代码示例,帮助读者掌握算法的实践应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# include<cstdio>
# include<iostream>
# define MAX 1000+4
# define inf 1e9
using namespace std;
int n,t;
int edge[MAX][MAX];
int dis[MAX];
int vis[MAX];
int u,v;
/*
void init(){
    for ( int i = 1;i <= n;i++ ){
        for ( int j = 1;j <= n;j++ ){
            if ( i==j ){
                edge[i][j] = 0;
            }
            else{
                edge[i][j] = inf;
            }
        }
    }
}
void input(){
    for(int i=0;i<t;i++){
        int t1,t2,t3;
        cin>>t1>>t2>>t3;
        if(t3<edge[t1][t2]){
           	edge[t1][t2] = t3;
            edge[t2][t1] = t3;
        }
    } 
} */
void Dijkstra(){
    for(int i = 1;i <= n;i++ ){
        vis[i] = 0;
        dis[i] = edge[s][i];//s为题中起点
    }
 	int _min;
    for(int i = 1;i <= n-1;i++ ){
		_min = inf;
    for(int j = 1;j <= n;j++ ){
        if (vis[j]==0&&dis[j] < _min ){
            _min = dis[j];
            u = j;
        }
    }
    vis[u] = 1;
       for(v = 1;v <= n;v++ ){
           if(vis[v]==0&&dis[v] > /*dis[u]+edge[u][v]视题意要求*/ ){
               dis[v] = /*dis[u]+edge[u][v];*/
           }
       }
	}
}
int main(){
  /*  while(cin>>t>>n ){
        init();
        input();
        Dijkstra();
        cout<<dis[1]<<endl;
	}*/
	return 0;
}

临接表版

struct edge{
    int to,w;
};

vector<edge> G[MAXN];

void dijkstra(int s) //s 代表起点
{
    for(int i =1;i<=N;i++) d[i]=INF;
    d[s]=0; //到某点的最短距离;
    priority_queue<pa ,vector<pa>,greater<pa> >Q;
    Q.push(pa(0,s)); //第一维代表路径 第二维代表当前点
    while(!Q.empty())
    {
        pa now=Q.top();Q.pop();
        int dist=now.first,v=now.second;
        if(dist > d[v]) continue;
        int len=G[v].size();
        for(int i=0;i<len;i++)
        {
            edge t=G[v][i];
            int newdist=t.w+d[v];
            if(newdist<d[t.to]) //松弛
            {
                d[t.to]=newdist;
                Q.push(pa(d[t.to],t.to));
            }
        }
    }
    return;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值