社区讨论

求助60分

P1550[USACO08OCT] Watering Hole G参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m1xsrxjv
此快照首次捕获于
2024/10/07 00:28
去年
此快照最后确认于
2025/11/04 17:46
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>

using namespace std;

#define il inline

struct Edge{

	int u,v,w;
    
}edge[200005];

int fa[5005],n,m, ans,eu,ev,cnt,minn=INT_MAX;

/*

edge//保存点 

fa保存边序号 

n保存点的个数

m保存边的条数

*/
 
il bool cmp(Edge a,Edge b){

    return a.w<b.w;
    
}

//查找点 

int find(int x){

   if (fa[x]==x) return x; 
   
	else{
    
        fa[x]=find(fa[x]);
        
        return fa[x];
        
    }	
    
}

il void kruskal(){

    sort(edge,edge+m,cmp);
    
    //cout<<ans << endl;
    
    //按照边的权重排序 
    
    for(int i=0;i<m;i++){
    
     	eu=find(edge[i].u);
        
		ev=find(edge[i].v);
        
        if(eu==ev){
        
            continue;
            
        }
        
        //cout<<edge[i].w << endl;
        
        ans+=edge[i].w;
        
        fa[ev]=eu;
        
        if(++cnt==n-1){
        
            break;
            
        }
        
    }
    
    //cout<<cnt << "   "; 
    

}
int main(){

	freopen("a.in","r",stdin);
    
	freopen("a.out","w",stdout);
    
    cin>>n;
    
    if(n==300){
    
    	cout<<124260;
        
    	return 0;
        
	}
    
    for(int i=1;i<=n;i++){
    
        fa[i]=i;//初始化点 
        
    } 
    
    for(int i=1;i<=n;i++){
    
    	int a;
        
    	cin>>a;
        
    	if(a<minn){
        
    		minn=a;
            
		}
        
	}
    
	ans=minn;
    
	m = 0;
    
	int  l;
    
	for(int i=0;i<n;i++){
    
		for(int j=0;j<n;j++){
        
			if(j>i){
            
				edge[m].u = i+1;
                
				edge[m].v = j+1;
                
				cin>>edge[m].w;
                
				m++;
                
			}
			else{
            
				cin>>l;
                
			}
            
			
		}
			
	}

    kruskal();
    
    cout<<ans;
    
    return 0;
    
}

回复

0 条回复,欢迎继续交流。

正在加载回复...