如题:http://poj.org/problem?id=1251
求最小生成树的权值和
输入:第一行:一个整数n,代表节点的个数 下面n-1行:每一行输入节点(A,B,C..),和这个节点相邻的节点数,然后输入的是邻接点,和权值.
输出:最小生成树权值和
prim算法
#include<iostream>
using namespace std;
#define MAX 27 //最大顶点数
#define MAXCOST 101 //权值上限
bool visited[MAX]; //是否从集合U-V,并入集合U
int edges[MAX][MAX]; //边表
int lowcost[MAX]; //记录这个点周围最小的权值边的顶点
int totalcost;
int minv; //记录这个点周围最小权值边的值
int prim(int vertex_num,int v) //从vertex_num个顶点中,v号节点开始构建最小生成树
{
int i,j;
totalcost=0;
visited[v]=true; //这个点被访问
for(i=0;i<vertex_num;i++)
lowcost[i]=edges[v][i]; //初始为这个点邻接点的权值
for(i=1;i<vertex_num;i++) //除V外其他的顶点
{
minv=MAXCOST;
for(j=0;j<vertex_num;j++)
if(visited[j]==false&&lowcost[j]<minv)
{
minv=lowcost[j]; //找到最小,更新
v=j;
}
visited[v]=true; //找到的最小权值边的邻接点被访问
totalcost+=minv;
for(j=0;j<vertex_num;j++)
{
if(visited[j]==false&&lowcost[j]>edges[v][j]) //更新下一个顶点的cost
lowcost[j]=edges[v][j];
}
}
return totalcost;
}
int main()
{
int num,degree,cost;
char vertex;
int i,j;
while(cin>>num)
{
if(num==0) break;
for(i=0;i<num;i++)
for(j=0;j<num;j++)
edges[i][j]=MAXCOST;
for(i=0;i<num;i++) visited[i]=false;
for(i=0;i<num-1;i++)
{
cin>>vertex>>degree;
for(j=0;j<degree;j++)
{
cin>>vertex>>cost;
edges[i][vertex-'A']=cost;
edges[vertex-'A'][i]=cost;
}
}
cout<<prim(num,0)<<endl;
}
return 0;
}