• PAT顶级 1024 Currency Exchange Centers (35分)(最小生成树)


    题目链接:

    1024 Currency Exchange Centers

    思路:

    1.该题求最小的cost使得所有货币可以互相转换,即最小生成树问题;
    2.我们使用kruskal算法来求,因为它可以方便的判定最小生成树的多样性;kruskal按照边权对边进行排序后,依次加入这些边,由于我们需要center最少,我们在边权相同的边中,优先遍历已经使用的center即可;

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e4+5;
    int par[maxn],rk[maxn];
    void init_(int n){for(int i=0;i<n;i++)par[i]=i;}
    int find(int x){
    	if(par[x]==x) return x;
    	else return par[x]=find(par[x]);
    }
    void unite(int x,int y){
    	x=find(x); y=find(y);
    	if(x==y) return;
    	if(rk[x]<rk[y]) par[x]=y;
    	else{par[y]=x;if(rk[x]==rk[y])rk[x]++;}
    }
    bool same(int x,int y){return find(x)==find(y);}
    struct edge{int u,v,cost;string id;}es[maxn];
    bool cmp(const edge& e1,const edge& e2){return e1.cost==e2.cost?e1.id<e2.id:e1.cost<e2.cost;}
    int n,m,vst[maxn],flag[maxn];
    unordered_map<string,bool> cent;    //center i has been visited
    int kruskal(){
    	sort(es,es+m,cmp); init_(n); int res=0;
    	for(int i=0;i<m;i++){
    		if(vst[i]) continue;
    		if(flag[i]==false) for(int j=i;j<m&&es[j].cost==es[i].cost;j++){
    			edge e=es[j]; flag[j]=true;
    			if(!same(e.u,e.v)&&cent[e.id]) unite(e.u,e.v),res+=e.cost,vst[j]=true;
    		}
    		edge e=es[i];
    		if(!same(e.u,e.v)) unite(e.u,e.v),res+=e.cost,vst[i]=true,cent[e.id]=true;
    	}
    	return res;
    }
    bool cmp2(const int& a,const int& b){return es[a].id==es[b].id?es[a].cost<es[b].cost:es[a].id<es[b].id;}
    void solve(){
    	int cost=kruskal(),ans=0;
    	for(auto& x:cent) if(x.second) ans++;
    	cout<<ans<<' '<<cost<<'
    ';
    	vector<int> v;
    	for(int i=0;i<m;i++) if(vst[i]) v.push_back(i);
    	sort(v.begin(),v.end(),cmp2);
    	for(int& x:v) cout<<es[x].u<<' '<<es[x].v<<' '<<es[x].id<<' '<<es[x].cost<<'
    ';
    }
    int main(){
    //	freopen("Sakura.txt","r",stdin);
    	ios::sync_with_stdio(false); cin.tie(0);
    	cin>>n>>m;
    	for(int i=0;i<m;i++) cin>>es[i].u>>es[i].v>>es[i].id>>es[i].cost;
    	solve();
    	return 0;
    }
    
  • 相关阅读:
    文本属性和字体属性
    BZOJ 2724: [Violet 6]蒲公英
    BZOJ4010: [HNOI2015]菜肴制作
    BZOJ 2160: 拉拉队排练
    HDU-5157Harry and magic string
    HDU-5421Victor and String
    BZOJ2565: 最长双回文串(回文树)
    BZOJ3676: [Apio2014]回文串(回文树)
    BZOJ 3195: [Jxoi2012]奇怪的道路(状压dp)
    BZOJ1758: [Wc2010]重建计划(01分数规划+点分治+单调队列)
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308722.html
Copyright © 2020-2023  润新知