Jungle Roads(最小生成树kruskal)

挺简单的一道题只不过开始没怎么注意看输入数据所以才先试了prim果然连样例都过不了。
题目链接
prim示范代码:

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define int long long
#define MMM 0x3f3f3f3f
struct node{//prim算法
    int to,val;
};
map<char,int> k;
vector<node> m[30]; int t; int dis[30]; int vis[30];
int prim(){
    memset(dis,MMM,sizeof(dis));
    vis[1]=true;
    for(int i=0;i<m[1].size();i++){
        int k=m[1][i].to; int j=m[1][i].val;
        dis[k]=j;
    }
    int ans=0;
    for(int i=1;i<t;i++){
        int MM=MMM; int k;
        for(int j=1;j<=t;j++){
            if(!vis[j]&&dis[j]<MM){
                MM=dis[j]; k=j;
            }
        }
        vis[k]=true; ans+=dis[k]; char d=k+'A'-1; cout<<ans<<" "<<d<<endl;
        for(int i=0;i<m[k].size();i++){
            int h=m[k][i].to; int l=m[k][i].val;
            if(!vis[h]){
                dis[h]=min(dis[h],l);
            }
        }
    }
    return ans;
}
signed main(){
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    for(int i=0;i<26;i++){
        k['A'+i]=i+1;
    }
    while(cin>>t){
        if(t==0) break;
        for(int i=0;i<t-1;i++){
            char c; int b; cin>>c>>b;
            for(int j=0;j<b;j++){
                char n; int s; cin>>n>>s;
                node p; p.to=k[n]; p.val=s;
                m[k[c]].push_back(p);
            }
        }
        int ans=prim();
        cout<<ans<<endl;
    }
    return 0;
}

后来认真看了样例给的边才知道这道题只能用kruskal来做最后ac。
kruskal ac代码:

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define int long long
#define MMM 0x3f3f3f3f
struct node{
    int st,to,val;
};
map<char,int> k;
vector<node> m;
int head[30]; int t; int vis[30];
int pinc(int c){
    if(head[c]==0)  return c;
    else return head[c]=pinc(head[c]);
}
bool cmp(node a,node b){
    return a.val<b.val;
}
int krus(int x){
    int ans=0;
    memset(head,0,sizeof(head));
    for(int i=0;i<x;i++){
        if(pinc(m[i].st)!=pinc(m[i].to)){
            ans+=m[i].val;
            char a,b; a=m[i].st+'A'-1; b=m[i].to+'A'-1;
            head[pinc(m[i].to)]=pinc(m[i].st);
        }
    }
    return ans;
}
signed main(){
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    for(int i=0;i<26;i++){
        k['A'+i]=i+1;
    }
    while(cin>>t){
        if(t==0) break;
        m.clear();
        for(int i=0;i<t-1;i++){
            char c; int b; cin>>c>>b;
            for(int j=0;j<b;j++){
                char n; int s; cin>>n>>s;
                node p; p.st=k[c]; p.to=k[n]; p.val=s;
                m.push_back(p);
            }
        }
        sort(m.begin(),m.end(),cmp);
        int ans=krus(m.size());
        cout<<ans<<endl;
    }
}

你可能感兴趣的:(最小生成树)