POJ :Networking

题目地址:

http://poj.org/problem?id=1287

最小生成树的模板题,不过要注意的是两条路之间可能不只有一条唯一的路,这里,选一条最小的路就行了。

代码:

//模板题
//但是在两条路径之中可以有多个边
//取最小的
#include <iostream>
#include<cstring>
using namespace std;
#define MAX 51
#define INF 9999999
int map[MAX][MAX];
int micost[MAX];
bool vis[MAX];
int N,M;
void Prim()
{
    int ans,i,j,v,Min;
    for(i=1;i<=N;i++)
    {
        vis[i]=0;
        micost[i]=map[1][i];
    }
    ans=0;
    micost[1]=0;
    vis[1]=1;
    if(N==1){
        cout<<0<<endl;
    return;
    }
    for(i=2;i<=N;i++)
    {
        Min=INF;
        for(j=2;j<=N;j++){
            if(!vis[j]&&Min>micost[j]){
                Min=micost[j];
                v=j;
            }
        }
            if(Min==INF)break;
            else{
                ans=ans+Min;
            vis[v]=1;
            }
            for(j=2;j<=N;j++)
            {
                if(!vis[j]&&micost[j]>map[v][j])
                    micost[j]=map[v][j];
            }
        }
        cout<<ans<<endl;
    }
int main()
{
    int i,j,a,b,c;
    while(cin>>N,N)
    {
        cin>>M;
    for(i=1;i<=N;i++)
        for(j=1;j<=N;j++)
        {
            if(i==j)map[i][j]=0;
            else
                map[i][j]=INF;
        }//初始化
        for(i=1;i<=M;i++)
        {
            cin>>a>>b>>c;
            if(map[a][b]>c)
                map[a][b]=map[b][a]=c;//取最小的
        }//输入
      Prim();
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值