hdu 1233 还是畅通工程

4 篇文章 0 订阅

主题思想: 最小生成树SPT,prime算法,
prime 算法核心代码,

vector<int> spt;
vector<int> g[maxn];

int SPT(int start){

    spt.clear();
    spt.push_back(start);
    visited[start]=true;
    int ans=0;
    int next=0;
    while(true){

        int len=spt.size();
        if(len==n) break;

        int mm=INF;
        int index=0;

        for(int i=0;i<len;i++){

            int cnt=g[spt[i]].size();

            for(int j=0;j<cnt;j++){

                next=g[spt[i]][j];

                if(!visited[next]){

                    if(d[spt[i]][next]<mm){

                        mm=d[spt[i]][next];
                        index=next;
                    }
                }
            }
        }

        spt.push_back(index);
        ans+=mm;
        visited[index]=true;

    }
    return ans;
}

AC 代码:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int INF=0x3fffffff;
const int maxn=105;
int d[maxn][maxn];
bool visited[maxn];

int n;

vector<int> spt;
vector<int> g[maxn];

int SPT(int start){

    spt.clear();
    spt.push_back(start);
    visited[start]=true;
    int ans=0;
    int next=0;
    while(true){

        int len=spt.size();
        if(len==n) break;

        int mm=INF;
        int index=0;

        for(int i=0;i<len;i++){

            int cnt=g[spt[i]].size();

            for(int j=0;j<cnt;j++){

                next=g[spt[i]][j];

                if(!visited[next]){

                    if(d[spt[i]][next]<mm){

                        mm=d[spt[i]][next];
                        index=next;
                    }
                }
            }
        }

        spt.push_back(index);
        ans+=mm;
        visited[index]=true;

    }
    return ans;
}

int main()
{
    int m=0;
    int f,t,w;
    while(scanf("%d",&n)!=EOF){

        if(n==0)break;

        memset(d,INF,sizeof(d));
        memset(visited,false,sizeof(visited));
        for(int i=0;i<maxn;i++) g[i].clear();

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

        for(int i=1;i<=m;i++){

            scanf("%d%d%d",&f,&t,&w);
            d[f][t]=w;
            d[t][f]=w;
            g[f].push_back(t);
            g[t].push_back(f);

        }
        int ans=0;
        ans=SPT(1);
        printf("%d\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值