算法集锦(找工作前看一看)DijStla||bellman-ford||floyd

一。图论

1.DijStla

void dijstra(){
	int i,j,ans=-1,min,v;
	int d[MAXV],vis[MAXV];
	//d数组表示从原点到i点的最短距离
	//vis用于表达这个点是否已经被选中
	for(i=1;i<=n;i++){
		d[i]=INF;
		vis[i]=0;
	}
	d[1]=0;		//因为start到start的距离为0,这里源点为1

	for(i=1;i<=n;i++){
		min=INF;
		for(j=1;j<=n;j++){		//每次找点的过程,首先这个点没有被发现,然后找一个最小点
			if(!vis[j] && d[j]<min){
				min=d[j];
				v=j;
			}
		}
		//这里为什么找的最小的边就一定是最短路呢
		//因为一个图要连通起来,就必须有一条边和已知点集连起来,所以找的最小的未知点必是最短路
		vis[v]=1;

		for(j=1;j<=n;j++)		//加进最小点后,再修改从源点没有被发现的点的最短路径
			if(!vis[j] && d[v]+map[v][j]<d[j])
				d[j]=d[v]+map[v][j];
	}

	for(i=2;i<=n;i++)
		if(d[i]>ans) ans=d[i];
	printf("%d\n",ans);
}

http://blog.csdn.net/challenchenzhipeng/article/details/8100454

2. bellman-ford

typedef struct{  
    int a,b,w;  
}Edge;  
  
Edge edge[MAXM];  
int n,m;  
  
void bellman_ford(){  
    int i,j;  
    int d[MAXV];  
    for(i=2;i<=n;i++) d[i]=inf;  
    d[1]=0;  
  
    for(i=1;i<=n;i++){  
        for(j=1;j<=m;j++){  
            if(d[edge[j].a]>edge[j].w+d[edge[j].b]) d[edge[j].a]=edge[j].w+d[edge[j].b];  
            if(d[edge[j].b]>edge[j].w+d[edge[j].a]) d[edge[j].b]=edge[j].w+d[edge[j].a];  
        }  
    }  
    printf("%d\n",d[n]);  
}  

http://blog.csdn.net/wangjian8006/article/details/7871889

3. floyd

void floyd(){  
    int i,j,k;  
    for(k=1;k<n;k++)  
        for(i=1;i<n;i++)  
            for(j=1;j<n;j++)  
                if(map[i][j]>map[i][k]+map[k][j])  
                    map[i][j]=map[i][k]+map[k][j];  
}  

4. prim

void Prim(MGraph g,int v,int ∑)
 /*
 *LowCost[i]:当前生成树(U集合)到顶点i的多条边中最短的一条边。
 *VexSet[i]:顶点i不在生成树中。1表示在里面,0反之。
 *MGraph用的邻接矩阵表示,其中用edges[i][j]来记录i-->j是否有关系。n表示顶点个数,e表示边的个数。
 */
 void Prim(MGraph g,int v,int ∑)
  {
       int LowCost[Max],VexSet[Max],v;
       int i,j,k,min;
 
      //初始化LowCost,VexSet数组  
 ​    for(i=0;i<g.n;i++)
 ​    {
 ​    ​    LowCost[i]=g.edges[v][i];
 ​    ​    VexSet[i]=0;
 ​    }​ 
 
    ​ ​ VexSet[v]=1;
 ​    ​  sum=0;
    /*------------------------------------------------我是分割线---------------------------------------------------------*/
      for(i=0;i<g.n;i++)
       {
            min = INF;//表示无穷或者大于所有的权值就行
 
           //找出LowCost的最短代价(权值)即找出最短边中的最短的一条。​    
           for(j=0;j<g.n;j++)
            {
                 if(VexSet[j]==0&&LowCost[j]<min)
                 {
                      min = LowCost[j];
                      k=j;
                 }
            }
    
           //将该条边加入生成树中
            VexSet[k]=1;
            v=k;
            sum+=min;//这个可以根据需要调整,这里做的是计算min的和。
 
           //加入一个顶点v之后,生成树到各个不在生成树的顶点的最小值也会变。
            //即更新LowCost数组(只计算不在生成树的顶点且只要更新与新添进去的顶点相关的边)。
            for(j=0;j<g.n;j++)
            {
                 if(VexSet[j]==0&&g.edges[v][j]<LowCost[j])
                 {
                      LowCost[j]=g.edges[v][j];
                 }
            }
 
       }
  }

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/chen_zhipeng/article/details/8100465
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞