求条,玄关
查看原帖
求条,玄关
681941
OIer_Hhy楼主2024/8/7 10:55
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=3e5+10;
int n,m,k;
int vis[N],fa[N];
struct edge{
	int u,v,w;
};
vector<edge> e;
bool cmp(edge a,edge b){
	return a.w<b.w;
}
int find(int x){
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
void merge(int x,int y){
	x=find(x),y=find(y);
	if(x==y) return ;
	fa[y]=x;
}
bool ask(int x,int y){
	return find(x)==find(y);
}
void solve(){
	memset(vis,0,sizeof vis);
	memset(fa,0,sizeof fa);
	e.clear();
	int ans=0,cnt=0,num=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1,u,v,w;i<=m;i++){
		cin>>u>>v>>w;
		e.push_back({u,v,w});
	}
	sort(e.begin(),e.end(),cmp);
	for(int i=0;i<m;i++){
		int fx=find(e[i].u),fy=find(e[i].v);
		if(fx!=fy){
			fa[fx]=fy;
			ans+=e[i].w;
			num++;
			vis[++cnt]=i;
			if(cnt==n-1) break;
		}
	}
	int flag=1,ANS=2E9;
	for(int i=1;i<=cnt;i++){
		if(!flag) break;
		for(int j=1;j<=n;j++) fa[j]=j;
		int ans1=0,num1=0;
		for(int j=0;j<m;j++){
			if(j==vis[i]) continue;
			int fx=find(e[j].u),fy=find(e[j].v);
			if(fx!=fy){
				fa[fx]=fy;
				ans1+=e[j].w;
				num1++;
				if(num1==n-1&&ans1!=ans) ANS=min(ANS,ans1);
			}
		}
	}
	cout<<ANS<<endl;
}
int main(){ 
	int t=1;
	while(t--) solve();
	return 0;
}

2024/8/7 10:55
加载中...