最小生成树

P3366 【模板】最小生成树

Prim

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
typedef pair<int,int> PII;
const int N=1e4+514,M=2e5+191,INF=0x7f7f7f7f7f7f7f7f;
int n,m,ans=0;
struct Edge{
	int val=0,to=0,nex=0;
}edge[5*M];
int head[N],cnt;
void add_edge(int a,int to_b,int val){
	edge[++cnt].nex=head[a];
	edge[cnt].val=val;
	edge[cnt].to=to_b;
	head[a]=cnt;
}
int dis[N]={};
int prim(){
	int anst=0;
	memset(dis,0x7f,sizeof(dis));
	priority_queue<PII,vector<PII>,greater<PII> >pq;
	bool vis[N]={};
	pq.push(make_pair(0,1));
	while(!pq.empty()){
		if(!pq.empty())if(vis[pq.top().second]){
			pq.pop();
			continue;
		}
		anst+=pq.top().first;
		int pos=pq.top().second;
		vis[pos]=1;
		pq.pop();
		for(int i=head[pos];i;i=edge[i].nex){
			int to=edge[i].to;
			int val=edge[i].val;
			if(!vis[to]&&dis[to]>val){
				dis[to]=val;
				pq.push(make_pair(val,to));
			}
		}
	}
	return anst;
}
signed main(){
	IOS
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		add_edge(x,y,z);
		add_edge(y,x,z);
	}
	int ans=prim();
	for(int i=2;i<=n;i++){
		if(dis[i]==INF){
			cout<<"orz"<<endl;
			return 0;
		}
	}
	cout<<ans<<endl; 
	return 0;
}

Kruskal

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
const int N=1e4+514,M=2e5+191,INF=0x7fffffff;
int n,m,ans=0;
struct Edge_in{
	int x,y,val;
}in[M];
//////最小生成树 
bool cmp1(Edge_in tmp1,Edge_in tmp2){
	return tmp1.val<tmp2.val;
}
//并查集 
int fa_un[N];
int find(int a){
	if(fa_un[a]==a)return a;
	return fa_un[a]=find(fa_un[a]);
}
void unionn(int x,int y){
	int fx=find(x),fy=find(y);
	if(fx!=fy)fa_un[fx]=fy;
}
void build_sptree(){
	sort(in+1,in+1+m,cmp1);
	for(int i=1;i<=n;i++)fa_un[i]=i;
	for(int i=1;i<=m;i++){
		int x=in[i].x,y=in[i].y,val=in[i].val;
		if(find(x)!=find(y)){
			unionn(x,y);
			ans+=val;
		}
	}
	return;
}
signed main(){
	IOS
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>in[i].x>>in[i].y>>in[i].val;
	}
	build_sptree();
	int fafafa=find(1);
	for(int i=2;i<=n;i++){
		if(find(i)!=fafafa){
			cout<<"orz"<<endl;
			return 0;
		}
	}
	cout<<ans<<endl; 
	return 0;
}
posted @ 2025-11-26 13:55  10mbps_十兆網路  阅读(0)  评论(0)    收藏  举报