Prim和Dijkstra

本文深入讲解了三种图算法:Dijkstra算法、Prim算法和另一种Dijkstra实现方式。这些算法分别用于求解带权图中的单源最短路径问题和最小生成树问题。通过详细的伪代码展示了算法的具体实现过程。

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

void dijk(int v)
{
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=len;i++)
        dist[i]=map[v][i];
    dist[v]=0;
    vis[v]=1;
    for(int i=1;i<=len;i++)
    {
        int m=maxn,f=0;
        for(int j=1;j<=len;j++)
            if(!vis[j]&&m>dist[j])
            {
                m=dist[j];
                f=j;
            }
        if(f==0)
            break;
        vis[f]=1;
        for(int j=1;j<=len;j++)
            if(!vis[j] && dist[j]>dist[f]+map[f][j])
                dist[j]=dist[f]+map[f][j];
    }
}
}


/*最小生成树是更新出t-1条边,每次选出当前符合条件最短的,并进行标记。*/
void prim()
{
    for(i=0;i<t-1;i++)   
	{
		min = inf;
		for(j=0;j<t;j++)
			if(vis[j])
			for(k=0;k<t;k++)
			if(!vis[k]&&w[j][k]<min)
			{
				min=w[j][k];
				f=k;
			}
		vis[f]=true;
		s+=min;
	}
}

/*
最短路是从起点开始搜寻,
不断更新d[i].
*/

void dijkstra(int start)  
{  
    int i,x,y,m;  
    memset(vis,0,sizeof(vis));  
    for(i=0;i<n;i++)  
    d[i]=(i==start?0:maxn);  
    for(i=0;i<n;i++)  
    {  
        m=maxn;  
        for(y=0;y<n;y++)  
            if(!vis[y]&&d[y]<=m)  
            {  
                m=d[y];  
                x=y;  
            }  
        vis[x]=1;  
        for(y=0;y<n;y++)  
            d[y]=min(d[y],d[x]+map[x][y]);  
    }  
} 
 
/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值