首页 > 编程语言 > 详细

HDOJ-1301(最小生成树模板+Prim算法)

时间:2019-09-06 21:50:18      阅读:70      评论:0      收藏:0      [点我收藏+]

Jungle Roads

HDOJ-1301

这是最小生成树的水题,唯一要注意的就是那个n,其实输入只有n-1行。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
const int INF=0X3F3F3F3F;
const int maxn=30;
const int maxm=80;
int n;
int rodes[maxn][maxn];
map<char,int> ma;
int mincost[maxn];
bool vis[maxn];
int prim(int s){
    memset(mincost,INF,sizeof(mincost));
    mincost[s]=0;
    memset(vis,0,sizeof(vis));
    int ans=0;
    for(int i=0;i<n;i++){
        int v=-1;
        int mins=INF;
        for(int j=0;j<n;j++){
            if(!vis[j]&&mincost[j]<mins){
                mins=mincost[j];
                v=j;
            }
        }
        if(v==-1)
            break;
        ans+=mins;
        vis[v]=1;
        for(int j=0;j<n;j++){
            mincost[j]=min(mincost[j],rodes[v][j]);
        }
    }
    return ans;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    for(int i=0;i<26;i++){
        ma[i+'A']=i;
    }
    while(cin>>n&&n){
        memset(rodes,INF,sizeof(rodes));
        for(int i=0;i<n-1;i++){
            char c;int k;
            cin>>c>>k;
            int from=ma[c];
            for(int j=0;j<k;j++){
                char c1;int cost;
                cin>>c1>>cost;
                //cout<<c<<" "<<c1<<cost<<endl;
                int to=ma[c1];
                rodes[from][to]=rodes[to][from]=min(rodes[from][to],cost);                
            }
        }
        cout<<prim(1)<<endl;
    }
    return 0;
}

HDOJ-1301(最小生成树模板+Prim算法)

原文:https://www.cnblogs.com/GarrettWale/p/11478238.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!