4 条题解

  • 1
    @ 2022-3-7 20:50:34

    kruskal

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int n,sum,cnt,num=0;
    int fa[110];
    struct node{
        int x,y,z;
    }edg[26000];
    void init(){
    	for(int i=1;i<=n;i++)
    		fa[i] = i;
    }
    bool cmp(node a ,node b)
    {
    	return a.z < b.z;
    }
    int find(int x){
    	return x==fa[x] ? fa[x] : fa[x]=find(fa[x]);
    }
    void kruskal(){
    	sum = cnt = 0;
    	sort(edg+1,edg+1+num,cmp);
    
    	// for(int i=1;i<=num;i++){
    	// 	cout<<edg[i].x<<"  "<<edg[i].y<<"  "<<edg[i].z<<endl;
    	// }
    	for(int i = 1 ;i <= num ; i++)
    	{
    		int x =  find(edg[i].x);
    		int y =  find(edg[i].y);
    		if(x!=y)
    		{
    			sum += edg[i].z;
    			// cout<<i<<" "<<edg[i].z<<" /// "<<endl;
    			cnt++;
    			fa[x] = y;
    			if(cnt == n-1)
    				break;
    		}
    	}
        cout<<sum<<endl;
    }
    int main(){
        while(cin>>n&&n){
    		num = 0;
    		memset(edg,0,sizeof(edg));
    		char p,pp;
    		int k;
    		for(int i=1;i<n;i++){
    			cin>>p;
    			cin>>k;
    			for(int j=1;j<=k;j++){
    				cin>>pp;
    				edg[++num].x = p-'A' + 1;
    				edg[num].y = pp-'A' + 1;
    				cin>>edg[num].z;
    				num++;
    			}
    			if(k) num--;
    		}
    		
    		init();
    
    		kruskal();
    	}
        return 0;
    }
    

    信息

    ID
    1326
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    41
    已通过
    25
    上传者