这个模板很简单,但是如果你真正地吃透它,那么你就会明显感觉不一样。
我刚开始学的时候(几个月前)没太认真,所有现在又重新来吃一遍,我比较喜欢用kruskal(因为大多数题用它就行了,但是比如有一个题叫“英语考试”,用prim更优,所以最好都掌握)。
模板要理解,不要死记硬背。
#include <cstdio> #include <iostream> #include<cstdlib> #include<cstring> #include<cmath> #include<queue> #include<algorithm> using namespace std; const int maxn=5000+10; const int maxm=200000+10; int n,m,ans=0; int fa[maxn]; int find(int x) { return x==fa[x]? x:fa[x]=find(fa[x]); } struct edge { int u,v,w; }e[maxm]; bool cmp(const edge &a,const edge &b) { return a.w<b.w; } void readdata() { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w); } } void writeans() { int x=find(1); for (int i=2;i<=n;i++) { int y=find(i); if (x!=y) { printf("orz\n"); return; } } printf("%d\n",ans); } void work() { sort(e+1,e+m+1,cmp); for(int i=1;i<=n;i++) { fa[i]=i; } for(int i=1;i<=m;i++) { int x=find(e[i].u); int y=find(e[i].v); if(x!=y) { fa[x]=y; ans+=e[i].w; } } } int main() { readdata(); work(); writeans(); return 0; }
要理解,不要死记硬背。