poj 2485 最小生成樹 Prim演算法 模板
阿新 • • 發佈:2018-11-13
嗯,沒錯是純模板,只要會模板就能ac的,
在這裡還是講一下模板的意思吧:大致就是現在起始點附近搜距離他最近的點v1,然後再以v1為點去搜距離v1最近的點,且之前都過的點不能再搜了,不明白的就去手畫一下過程吧。
程式碼:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=510; const int maxm=1e6+10; int map[maxn][maxn]; int low[maxn]; int vis[maxn]; int L[maxm]; int n,m,cnt; long long prim() { long long sum=0; int pos=1; vis[1]=1; for(int i=1;i<=n;i++) { if(!vis[i]) low[i]=map[pos][i]; } for(int i=2;i<=n;i++) { int min=0x3f3f3f3f; for(int j=1;j<=n;j++) { if(!vis[j]&&min>low[j]) { min=low[j]; pos=j; } } sum+=min; L[cnt++]=min; vis[pos]=1; for(int j=1;j<=n;j++) { if(!vis[j]&&low[j]>map[pos][j]) { low[j]=map[pos][j]; } } } return sum; } void ini() { memset(vis,0,sizeof(vis)); memset(L,0,sizeof(L)); memset(low,0,sizeof(low)); cnt=0; } int main() { int T; scanf("%d",&T); while(T--) { ini(); scanf("%d",&n); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { int a; scanf("%d",&a); map[i][j]=a; } } long long ans=prim(); sort(L,L+cnt); printf("%d\n",L[cnt-1]); } return 0; }