现在的位置: 首页 > 综合 > 正文

Prim和Dijkstra

2013年10月12日 ⁄ 综合 ⁄ 共 746字 ⁄ 字号 评论关闭
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]);  
    }  
} 
 

/

抱歉!评论已关闭.