最小生成树模板

来源:互联网 发布:郑州软件开发工资 编辑:程序博客网 时间:2024/06/07 21:00

稀疏图:kruskal


#include<bits/stdc++.h>#define maxn 300001using namespace std;template <typename T> void read(T &x){x=0;int f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0';x*=f;}struct Edges{int u,v,w;}edges[maxn];int n,m,ans,tot;int fa[maxn],num[maxn];void init(){for(int i=1;i<=n;++i){fa[i]=i;num[i]=0;}}inline bool cmp(const Edges&a,const Edges&b){return a.w<b.w;}int getfa(int x){if(fa[x]==x) return x;else return fa[x]=getfa(fa[x]);}bool samefa(int x,int y){return getfa(x)==getfa(y);}void uniont(int x,int y){fa[y]=x;num[x]+=num[y];}void merge(int x,int y){int fx=getfa(x),fy=getfa(y);if(num[fx]>num[fy]) uniont(fx,fy);else uniont(fy,fx);}int main(){read(n),read(m);init();for(int i=1;i<=m;++i){read(edges[i].u);read(edges[i].v);read(edges[i].w);}sort(edges+1,edges+m+1,cmp);for(int i=1;i<=m;++i){if(samefa(edges[i].u,edges[i].v)) continue;ans+=edges[i].w;++tot;if(tot==n-1) break;merge(edges[i].u,edges[i].v);}cout<<ans<<endl; return 0;}

稠密图:prim


#include<bits/stdc++.h>#define maxn 10001#define maxm 300001#define inf 1e9using namespace std;template <typename T> void read(T &x){x=0;int f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0';x*=f;}int head[maxn],dis[maxn];int nxt[maxm],to[maxm],wei[maxm];int total,n,m,ans;bool vis[maxn];void add(int u,int v,int w){++total;to[total]=v;wei[total]=w;nxt[total]=head[u];head[u]=total;}void prim(){memset(vis,0,sizeof(vis));for(int i=1;i<=n;++i) dis[i]=inf;dis[1]=0;for(int ti=1;ti<=n;++ti){int jd=-1;for(int i=1;i<=n;++i)if(!vis[i]&&(jd==-1||dis[i]<dis[jd])) jd=i;vis[jd]=1;for(int e=head[jd];e;e=nxt[e]){if(!vis[to[e]]&&dis[to[e]]>wei[e]) dis[to[e]]=wei[e];}}}int main(){read(n),read(m);for(int i=1;i<=m;++i){int u,v,w;read(u),read(v),read(w);add(u,v,w);add(v,u,w);}prim();for(int i=1;i<=n;++i) ans+=dis[i];cout<<ans<<endl; return 0;}


因为main函数里面没有运行prim()

全部输出了0

懵了很久

一开始做prim时千万不要写vis[1]=1!


原创粉丝点击