hdu 1879 prime 继续畅通工程

这篇博客主要介绍了如何解决HDU 1879 ACM竞赛题目——Prime畅通工程。博主指出,若A、B两点间有路径,其距离即为0。解题策略类似于求最小生成树,详细解析见代码。
摘要由CSDN通过智能技术生成

题目 http://acm.hdu.edu.cn/showproblem.php?pid=1879

这个题目一开始想通二个来标记  后面发现不要了  ,其实如果A B点间有路那么直接说这个距离是0  这样就可以了 

  然后就是想其他求最小生成树一样哦。。

具体看代码哦

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define inf 999999
int map[101][101];
int dis[101];
bool mark[101];
int n;

void prime()
{

    memset(dis,0,sizeof(dis));
    memset(mark,false,sizeof(mark));

    int i,j,k,min,sum;
    for(i=1;i<=n;i++)
    dis[i]=map[1][i];

     k=0;
     dis[1]=0;
     sum=0;
    mark[1]=true;
    for(i=2;i<=n;i++)
    {
        min=inf;
        for(j=1;j<=n;j++)
        {
            if(!mark[j]&&dis[j]<min)
            {
                min=dis[j];
                k=j;
            }
        }
        mark[k]=true;
        sum+=min;
        for(j=1;j<=n;j++)
        {
            if(!mark[j]&&dis[j]>map[k][j])
            {
                dis[j]=map[k][j];
            }
        }
    }
   cout<<sum<<endl;
}

int main()
{
    int i,j,m1,m2,k,v;
    while(scanf("%d",&n)!=EOF,n)
    {

        memset(map,inf,sizeof(map));

         j=n*(n-1)/2;

        for(i=1;i<=j;i++)
        {
            cin>>m1>>m2>>k>>v;

            if(v){ map[m1][m2]=map[m2][m1]=0;}  ///这里就是我上面所说的。。
            else  {map[m1][m2]=map[m2][m1]=k;}
        }
       prime();
    }
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值