最优灌溉 prim kruscal算法

最优灌溉 prim kruscal算法

Kruscal 算法

#include<iostream>
#include<algorithm>
using namespace std;

typedef long long LL;


const int max_n=1005;
const int max_m=100005;

LL ans;

int n,m;
int fa[max_n];
struct Edge{
    
    
	
	int u;
	int v;
	int w;
	
	bool operator <(const Edge ee) const{
    
    
		return w<ee.w;
	}
}e[max_m];

void init()
{
    
    
	for(int i=1;i<=n;i++)
	{
    
    
		fa[i]=i;
	}
}

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


int main()
{
    
    
	cin>>n>>m;
	
	init();
	int u,v,w; 
	for(int i=0;i<m;i++)
	{
    
    
		scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
	}
	sort(e,e+m);
	
	for(int i=0;i<m;i++)
	{
    
    
		u=e[i].u;
		v=e[i].v;
		w=e[i].w;
		
		if(find(u)!=find(v))
		{
    
    
			ans+=w;
			fa[find(u)]=find(v);
		}
		
	}
	cout<<ans;
	
	return 0;
}

prim 算法

超时 的优先队列 只得了70分,

#include<iostream>
using namespace std;
#include<queue>
#include<cstring>
#include<vector> 

typedef long long LL;

int n,m;

int h[1005];
int ne[100005];
int idx;

LL ans;
int vis[1005];

struct Eage{
    
    
	int v;
	int len;
	
	bool operator<(const Eage & aa) const{
    
    
		
		return len>aa.len;
	}

}e[100005];


priority_queue<Eage> qq;


void init()
{
    
    
	memset(h,-1,sizeof(h));
}

void add(int u,int v,int w)
{
    
    
	e[idx].v=v;
	e[idx].len=w;
	ne[idx]=h[u];
	h[u]=idx++;
}


void prim()
{
    
    
	vis[1]=1;
	
	int v;
	int w;
	
	for(int i=h[1];~i;i=ne[i])
	{
    
    
		if(!vis[e[i].v])
		{
    
    
			qq.push(e[i]);
		}
	}
	Eage tt;
	
	for(int i=1;i<n;i++)  //共找n-1条边
	{
    
    
		while(vis[qq.top().v])  
		{
    
    
			qq.pop();
		}
		
		tt=qq.top();  //每次选出距离vis等于1图最近的一个顶点,即一条边
		
		vis[tt.v]=1;
		
		ans+=tt.len;
		qq.pop();
		
		v=tt.v;
		
		for(int k=h[v];~k;k=ne[k])  //将其他顶点到该图的距离加入队列
		{
    
    
			if(!vis[e[k].v])
			qq.push(e[k]);
		}
	}
	
}

int main()
{
    
    
	cin>>n>>m;
	
	init();
	int u,v,w;
	
	for(int i=0;i<m;i++)
	{
    
    
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
		add(v,u,w);
	}
	
	prim();
	
	cout<<ans;
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45448563/article/details/114105384