ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Dijkstra(迪杰斯特拉)

2022-08-19 13:34:18  阅读:114  来源: 互联网

标签:const ll 迪杰 add long Dijkstra 斯特拉 void define


朴素Dijkstra

时间复杂度O(n^2)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl "\n"
#define fi first
#define se second
#define pb push_back
#define pll pair<ll,ll>
const ll mod=1e9+7;
const ll N=3e3+9;
bool book[N];
ll a[N][N],b[N];
ll n,m,s,t;
void f1(ll s)
{
	for(ll i=1;i<=n;i++)
		b[i]=a[s][i];
	for(ll i=1;i<=n;i++)
	{
		ll t=-1;
		for(ll j=1;j<=n;j++)
			if(!book[j]&&(t==-1||b[t]>b[j]))
				t=j;
		book[t]=true;
		for(ll j=1;j<=n;j++)
			b[j]=min(b[j],b[t]+a[t][j]);
	}
}
void f0(ll T)
{
	cin>>n>>m>>s>>t;
	for(ll i=1;i<=n;i++)
		for(ll j=1;j<=n;j++)
			if(i==j)
				a[i][j]=0;
			else
				a[i][j]=1e9;
	while(m--)
	{
		ll x,y,z;
		cin>>x>>y>>z;
		a[x][y]=a[y][x]=min(a[x][y],z);
	}
	f1(s);
	cout<<b[t]<<endl;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	ll T=1;
//	cin>>T;
	for(ll i=1;i<=T;i++)
		f0(i);
	return 0;
}

堆优化Dijkstra

时间复杂度O(mlogn)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl "\n"
#define fi first
#define se second
#define pb push_back
#define pll pair<ll,ll>
const ll mod=1e9+7; 
const ll N=7e3*2+9;
struct pp
{
	ll x,y,z;
}p[N];
bool book[N];
ll a[N],b[N];
ll n,m,s,t,k;
void dijkstra(ll s)
{
	priority_queue<pll,vector<pll>,greater<pll>>q;
	for(ll i=1;i<=n;i++)
	{
		b[i]=1e18;
		book[i]=false;
	}	
    b[s]=0;
    q.push({0,s});
    while(q.size())
    {
        ll x=q.top().se;
        q.pop();
        if(book[x])
        	continue;
        book[x]=true;
        for(ll i=a[x];i!=-1;i=p[i].x)
        {
            ll y=p[i].y;
            if(b[y]>b[x]+p[i].z)
            {
                b[y]=b[x]+p[i].z;
                q.push({b[y],y});
            }
        }
    }
}
void add(ll x,ll y,ll z)
{
	p[k].x=a[x];
	p[k].y=y;
	p[k].z=z;
	a[x]=k++;
}
void f0(ll T)
{
    k=0;
    cin>>n>>m>>s>>t;
    memset(a,-1,sizeof a);
    memset(p,0,sizeof p);
    while(m--)
    {
    	ll x,y,z;
    	cin>>x>>y>>z;
        add(x,y,z);
        add(y,x,z);
    }
    dijkstra(s);
    cout<<b[t]<<endl;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	ll T=1;
//	cin>>T;
	for(ll i=1;i<=T;i++)
		f0(i);
	return 0;
}

 

标签:const,ll,迪杰,add,long,Dijkstra,斯特拉,void,define
来源: https://www.cnblogs.com/2021sgy/p/16564673.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有