模板-----------最小生成树之prim及优化

未加优化

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int INF=0x7fffffff/2;
int n,m,t,dis[5050],MST,min1,mp[5002][5002];
bool fl[5050];
int main()
{
	int u,v,w,i,j;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	 for(j=1;j<=n;j++)
	   mp[i][j]=INF;
	for(i=1;i<=m;i++) 
	{
		scanf("%d%d%d",&u,&v,&w);
		if(u!=v)  mp[u][v]=mp[v][u]=min(mp[u][v],w);
	}
	for(i=1;i<=n;i++)
	 dis[i]=INF;
	dis[1]=0;
	for(i=1;i<=n;i++)
	{
		min1=INF*2;
		for(j=1;j<=n;j++)
		 if(!fl[j]&&min1>dis[j])
		 {
		 	min1=dis[j]; t=j;
		 }
		fl[t]=true;
		for(j=1;j<=n;j++)
		  if(!fl[j]&&mp[t][j]<dis[j])
		   dis[j]=mp[t][j];
	}
	for(i=1;i<=n;i++)
	 MST+=dis[i];
	printf("%d",MST);
	return 0;
 } 

优化后(采用堆和邻接表来优化以减少循环)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define re register
#define inl inline
#define LL long long
using namespace std;
const int MAXN=2e5+5; 
typedef pair<int,int> pll;
priority_queue<pll,vector<pll>,greater<pll> >q;
int n,m;
int dis[MAXN],mst,cnt;
bool vis[MAXN];
int h[MAXN],nxt[2*MAXN],to[2*MAXN],len[2*MAXN],num_edge;
inl void add_edge(int x,int y,int z)
{
	nxt[++num_edge]=h[x];
	to[num_edge]=y;
	len[num_edge]=z;
	h[x]=num_edge; 
}
int main() 
{
	int u,v,w;
	scanf("%d%d",&n,&m);
	for(re int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&u,&v,&w);
		add_edge(u,v,w);
		add_edge(v,u,w);
	}
	memset(dis,0x7f,sizeof(dis));
	dis[1]=0;
	q.push(make_pair(dis[1],1));
	while(!q.empty()&&cnt<n)
	{
		int k=q.top().second;
		q.pop();
		if(vis[k]) continue;
		cnt++;
		vis[k]=true;mst+=dis[k];
		for(re int i=h[k];i;i=nxt[i])
		{
			if(!vis[to[i]]&&dis[to[i]]>len[i])
			{
		 	   dis[to[i]]=len[i];
		 	   q.push(make_pair(dis[to[i]],to[i]));
		    }
		}
	}
	if(cnt==n) printf("%d\n",mst);
	else printf("orz\n");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42920131/article/details/85370561