posts - 195,  comments - 30,  trackbacks - 0
#include<stdio.h>
#define MAX 0xfffffff
#define MaxVertex 21
//prim求最小支持树,多用于求边稠密网的最小支持树 时间复杂度O(n*n)n为顶点数;
#define  vertextype int
int n;
bool s[MaxVertex];//该点是否被访问
vertextype cost[MaxVertex];
vertextype dist[MaxVertex][MaxVertex];
void Init()
{
 int i,j,a,b,c;
  scanf("%d",&n);//先输入点个数
    for(i=1;i<=n;i++)
     for(j=1;j<=n;j++)
      dist[i][j]=MAX;
    while(scanf("%d%d%d",&a,&b,&c),a||b||c)//0 0 0表示边输入结束
     dist[a][b]=dist[b][a]=c;
    s[1]=true;//该点已经被访问
    for(i=2;i<=n;i++)
    {
     cost[i]=dist[1][i];
     s[i]=false;//初始化为false
    }
}
int main()
{
 freopen("s.txt","r",stdin);
 freopen("key.txt","w",stdout); 
int i,j,k,m,a,b,c,best,min;
    best=0;
 Init();
for(i=1;i<n;i++)//i不能等于n,因为n-1条边
{
 min=MAX;
 j=1;
 for(k=2;k<=n;k++)
  if(cost[k]<min&&(!s[k]))//  (1)
  {
   min=cost[k];
   j=k;
  }
  s[j]=true;
  best+=min;
  for(k=2;k<=n;k++)
  {
   if(dist[j][k]<cost[k]&&(!s[k]))//可能出现已经访问过的点cost[k]保持原值,但这没有关系,以为在上面的处理步骤(1)中不对这些边处理
  //dist[j][j]<cost[k]的比较则是为了重判集合V到V-U集合的点的距离,注意是整个集合V到各个未纳入V的点的距离!
   cost[k]=dist[j][k];
  }
}
 printf("%d\n",best);
 return 0;
}
学以致用 joj 1170
posted on 2009-08-09 19:52 luis 阅读(400) 评论(0)  编辑 收藏 引用 所属分类: 图论*矩阵

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2013年3月>
242526272812
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(3)

随笔分类

随笔档案

文章分类

文章档案

友情链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜