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

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;
}
posted @ 2019-09-06 21:02  Garrett_Wale  阅读(139)  评论(0编辑  收藏  举报