NEFU OJ 205 最小树(一)

  • description

    某省长调查交通情况,发现本省交通事故发生不断,于是决定在本省内全部修建地铁。
    该省长得到的统计表中列出了任意两市之间的距离,为了确保任何两个市都可以直接
    或者间接实现地铁交通,并要求铺设的地铁总长度最小,请计算最小的地铁总长度。
    
    
    							

    input

    测试输入包含若干测试用例。每个测试用例的第一行给出市的数目n,(n < 50);随后的
    n(n-1)/2行对应市之间的距离,每行给出一对正整数,分别是两个市的编号,以及两
    市之间的距离。为简单起见,市从1到n编号,当n为0时,输入结束,该样例不做处理。
    
    							

    output

    对每个测试用例,在一行里输出最小的地铁总长度,保留两位小数。
    							

    sample_input

    3
    1 2 1.8
    1 3 2.9
    2 3 4.5
    0
    
    							

    sample_output

    4.70



    用前向星写着玩玩,当然直接临接表会快些
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<stack>
    #include<map>
    #include<vector>
    #include<queue>
    #include<set>
    #include<iomanip>
    #include<cctype>
    #define MAX  456789123
    using namespace std;
    struct node
    {
        int next,to;
        double val;
    }bb[1000];
    int sum=0,head[1000];
    double ans=0,sss[1000];int N;
    int visit[1000];
    void add(int a,int b,double c)
    {
        bb[sum].to=b;
        bb[sum].next=head[a];
        bb[sum].val=c;
        head[a]=sum++;
    }
    void zx(int a)
    {
        double max=MAX;int k=MAX;
        for(int i=head[a];i!=-1;i=bb[i].next)
        {
            int u=bb[i].to;
            if(!visit[u])
            {
                if(bb[i].val<=sss[u]){sss[u]=bb[i].val;}
            }
        }
        for(int i=1;i<=N;i++)
        {
            if(!visit[i]&&sss[i]<max)
            {
                max=sss[i];k=i;
            }
            cout<<i<<' '<<sss[i]<<endl;
        }
        visit[k]=1;
        ans=ans+max;
    }
    int main()
    {
    
    
        while(cin>>N&&N)
        {
            for(int i=1;i<=N;i++)
                sss[i]=MAX;
            memset(visit,0,sizeof(visit));
            memset(head,-1,sizeof(head));
            int n;
           n=N*(N-1)/2;
            while(n--)
            {
                int a,b;
                double c;
                cin>>a>>b>>c;
                add(a,b,c);
                add(b,a,c);
            }
            for(int i=1;i<N;i++)
            {
                visit[i]=1;
                zx(i);
            }
            printf("%.2f\n",ans);
        }
    }

猜你喜欢

转载自www.cnblogs.com/SparkPhoneix/p/8858483.html