toj3073 Country road prim算法 典型题

本文详细解析了TOJ3073 Countryroad问题,并使用Prime算法求解最小生成树问题。通过具体实现展示了如何利用C++进行初始化、边权重更新以及寻找最小生成树的过程。

要进行一些初始化的处理~

//toj3073 Country road prime算法 典型题
#include<iostream>
#include<memory.h>
#define MAX 200000
using namespace std;
int map[1005][1005];
int visit[1005];
int dist[1005],i,j,k,m,n;
int prime()
{
    int sum,min,pos;
    sum=0;
    memset(visit,0,sizeof(visit));//初始化visit 
    visit[1]=1;
    for(i=1;i<=n;i++)
       dist[i]=map[1][i];//dist中存map中1到所有点的值
    for(i=0;i<n;i++)//找出生成树集合点集相连最小权值的边 
    {
       min=MAX;
       for(j=1;j<=n;j++)
           if(visit[j]==0&&dist[j]<min)
           {
               pos=j;
               min=dist[j];                            
           } 
       //if(min==MAX) return -1;//找不到               
       visit[pos]=1;//pos点加入最小生成树集合 
       //sum+=min; 
       for(j=1;j<=n;j++)//更新dist数组 
       {
           if(visit[j]==0&&map[pos][j]<dist[j])
               dist[j]=map[pos][j];                  
       } 
    }
    for(i=1;i<=n;i++)
    {   
       sum+=dist[i];
       if(dist[i]==MAX)return -1;
    }
    return sum;
}
int main()
{
    int cases;
    int s,e,v;
    cin>>cases;
    while(cases--)
    {
        cin>>n>>m>>k;//n条路,m个已修路,k个待修路
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
               if(i==j)map[i][j]=0;//自己到自己是通的 
               else map[i][j]=MAX;//初始化一开始都不通             
        }//init
        for(i=1;i<=m;i++)
        {
            cin>>s>>e;//s到e点修了路
            map[s][e]=map[e][s]=0;//通了,花费0 
        } 
        for(i=1;i<=k;i++)
        {
            cin>>s>>e>>v;//s到e 花费为v 
            map[s][e]=map[e][s]=v;//通了 
        }   
        cout<<prime()<<endl;       
    }
    return 0;   
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值