POJ 1251 Jungle Roads (prim)

题目链接:http://poj.org/problem?id=1251

//双向图
//点的数量小,采用邻接矩阵 
//最小生成树prim 
#include<iostream>
#include<cstring>
#include<iomanip>
#define INF 100000
using namespace std;

const int maxn=30;

int dis[maxn];
bool vis[maxn];
int map[maxn][maxn];
int sum,m,b,n;
char a,a1;
void prim()  
{  
    int temp;  
    for(int i=1;i<=n;i++)  
    {  
        int cf=INF;  
        for(int j=1;j<=n;j++) 
        {
            if(!vis[j]&&dis[j]<cf)  
            {  
                temp=j;  
                cf=dis[j];  
            }        
        }
        if(cf==INF)  
            cf=0; 
        sum+=cf;  
        vis[temp]=true;  
        for(int j=1;j<=n;j++)  
            if(!vis[j]&&map[temp][j]<dis[j])  
                dis[j]=map[temp][j];  
    }  
}

int main (){

    while(cin>>n&&n)
    {
        for(int i=0;i<30;i++)  
            for(int j=0;j<30;j++)  
            {  
                map[i][j]=INF;  
                vis[i]=false;  
            }  

            for(int i=2;i<=n;i++)  
            {  
                cin>>a>>m;            
                while(m--)  
                {  
                    cin>>a1>>b;  
                    map[a-65+1][a1-65+1]=map[a1-65+1][a-65+1]=b;  
                }  
            }  

            for(int i=1;i<=n;i++)    
                dis[i]=map[i][1];      
            vis[1]=true;  
            sum=0;  
            prim();
            cout<<sum<<endl;
    }
    return 0;
}

 

posted @ 2014-02-17 13:11  neverchanje  阅读(173)  评论(0编辑  收藏  举报