单源最短路——dijkstra算法

在这里插入图片描述
首先我们应该考虑的是如何将这个图中的每条有向边表示出来
刚开始大家肯定都会想到用二维数组,用坐标来写两个点间的距离,但这会造成时间和空间的巨大浪费,因此,我们就需要新型高效的方法来储存这些有向边——
1.链式前向星

struct edge 
{ 
    int next;
    int to;
    int val;
}a[maxn];
int head[maxn];//head[i]为i点的第一条边
int cnt=0;
void addedge(int u,int v,int w) //起点,终点,权值 
{
    a[++cnt].next=head[u];//更新cnt
    a[cnt].to=v;
    a[cnt].w=w;
    head[u]=cnt;
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        addedge(x,y,z);
        //如果是无向图,还要addedge(b,a,wei);
    }
}

在得到每条有向(无向)边后,接下来就要开始遍历了,在遍历以x为起点的所有边时,只需要这样就行:

for(int i=head[pos];i!=0;i=a[i].next)

下面贴上遍历的代码:

//这里我们需要在全局变量里定义ans[maxn],用来记录源点到每个点的最短路程
	int pos=s;
	while(vis[pos]==0){
		ll minn=inf;
		vis[pos]=1;
		for(int i=head[pos];i!=0;i=a[i].next){
			if(vis[a[i].to]!=1&&ans[a[i].to]>ans[pos]+a[i].val)
				ans[a[i].to]=ans[pos]+a[i].val;
		}
		for(int i=1;i<=n;i++)
            if(ans[i]<minn&&vis[i]==0){
                minn=ans[i];
                pos=i;
            }
	}

最后输出你所需要位置的值即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值