1. 程式人生 > >最小生成樹——Prim演算法

最小生成樹——Prim演算法

#define INF 0x3f3f3f3f
int Map[110][110];//記錄節點間關係,可達記為1,否則記為0;
bool vis[110];//記錄節點是否被遍歷;
int dis[110];
void Prim()
{
    memset(vis,false,sizeof(vis));
    int i,j;
    int sum=0;//記錄最小花費
    //將1節點與其餘節點的可達關係存入到dis陣列;
    for(i=1; i<=n; i++)
        dis[i]=Map[1][i];
    vis[1]=true;
    for(i=1; i<n; i++)
    {
        int m=INF;//記錄i節點與其餘節點的最短可達代價        
        int pos;        
        //尋求與i節點有關的代價最小的節點        
        //若節點存在,pos記錄該節點的位置,m記錄可達代價        
        for(j=1;j<=n;j++)        
        {           
            if(!vis[j]&&dis[j]<m)                
            pos=j,m=dis[j];        
        }        
        if(m==INF) break;//查詢結束        
        vis[pos]=true;        
        sum+=m;//計算到當前為止所花費的代價        
              
        for(j=1;j<=n;j++)//更新dis;              
            if(!vis[j]&&dis[j]>Map[pos][j])                
                dis[j]=Map[pos][j];    
    }
        printf("%d\n",sum);
}