Chinaunix首页 | 论坛 | 博客
  • 博客访问: 445226
  • 博文数量: 98
  • 博客积分: 6011
  • 博客等级: 准将
  • 技术积分: 1030
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-23 13:19
文章分类

全部博文(98)

文章存档

2011年(2)

2009年(2)

2008年(31)

2007年(35)

2006年(28)

我的朋友

分类:

2008-07-24 11:29:06

题目:
题目大意就不用说了,一看图就知道了。典型的最小生成树,直接套Prim模板就可以。Prim的大致为贪心思想,每次选择是小权值边进行贪心。与Dij异曲同工,一个前者每次选择最小边,后者每次选择最短距离的顶点。这题直接敲Prim,一次AC。郁闷的是,这题我敲Kruscal,WA..
my code:
 

#include<iostream>
using namespace std;

const int inf=0x7fffffff;
const int maxint=50;

int Prim(int n,int c[50][50])
{
    int lowcost[maxint];
    int close[maxint];
    int mit,i,j,k,MIN;bool s[maxint];
    for(i=1;i<=n;i++)
    {
        lowcost[i]=c[1][i];
        close[i]=1;
        s[i]=0;
    }
    s[1]=1;mit=0;
    for(i=1;i<n;i++)
    {
        MIN=inf;
        for(j=2;j<=n;j++)
        {
            if(!s[j]&&MIN>lowcost[j])
            {
                MIN=lowcost[j];
                k=j;
            }
        }
        mit+=lowcost[k];s[k]=1;
        for(j=2;j<=n;j++)
        {
            if(!s[j]&&lowcost[j]>c[j][k])
            {
                lowcost[j]=c[j][k];
                close[j]=k;
            }
        }
    }
    return mit;
}
int main()
{
    int n,i,j,t,dis;
    int c[50][50];
    char a,b;
    while(cin>>n&&n)
    {
        for(i=1;i<=n;i++)for(j=1;j<=n;j++) c[i][j]=inf;
        for(i=1;i<n;i++)
        {
            cin>>a>>t;
            for(j=1;j<=t;j++)
            {
                cin>>b>>dis;
                if(c[a-'A'+1][b-'A'+1]>dis)
                {
                    c[b-'A'+1][a-'A'+1]=dis;
                    c[a-'A'+1][b-'A'+1]=dis;
                }
            }
        }
        cout<<Prim(n,c)<<endl;
    }
    return 0;
}

阅读(1859) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

hinus2008-11-07 10:56:24

我的 Kruscal 也是 wa, 郁闷...