Dijkstra模板

本文详细介绍了Dijkstra算法的两种实现方式:原始版本和优先队列优化版本。通过具体代码展示了如何寻找图中两点间的最短路径,适用于了解和学习Dijkstra算法原理及其应用。

Dijkstra

struct node
{
	long long x,d;
	node();
	node(long long xx,long long dd){
		x = xx;
		d = dd;
	}
};

vector<node> edge[maxn];

void dijkstra(long long x)
{
	long long i,j;
	for(i=0;i<n;i++) vis[i] = 0,dis[i] = INF;
	dis[x] = 0;

	for(i=0;i<n;i++){
		long long minn = INF;
		long long u = 0;
		for(j=0;j<n;j++){
			if(!vis[j] && minn > dis[j]){
				minn = dis[j];
				u = j;
//                cout<<"A "<<minn<<" "<<u<<endl;
			}
		}
        vis[u] = 1;
		for(j=0;j<edge[u].size();j++){
            long long v = edge[u][j].x;
			if(!vis[v] && (minn + edge[u][j].d) < dis[v])
				dis[v] = minn + edge[u][j].d;
		}
	}
}

 优先队列优化

const int MAXN = 50010;
const ll INF = ((ll)1<<62);
struct node{
    int x;
    ll d;
    node(){}
    node(int a,ll b){x = a;d = b;}
    bool operator < (const node & a) const
    {
        if(d == a.d) return x < a.x;
        else return d > a.d;
    }
};

vector<node> edge[MAXN];    //记得清边
ll dis[MAXN];
int N;  //N从1到N

void Dijkstra(int s)
{
    for(int i = 1; i <= N; i++) dis[i] = INF;
    dis[s] = 0;
    priority_queue<node> q;
    q.push(node(s,dis[s]));
    while(!q.empty()){
        node x = q.top();
        q.pop();
        for(int i = 0;i < edge[x.x].size(); i++){
            node y = edge[x.x][i];
            if(dis[y.x] > x.d + y.d){
                dis[y.x] = x.d + y.d;
                q.push(node(y.x,dis[y.x]));
            }
        }
    }
}

 

转载于:https://www.cnblogs.com/Tokisaki-Kurumi-/p/8855725.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值