常用登陸驗證-後端AuthController.php
阿新 • • 發佈:2022-04-13
1.Prim
#include<iostream> #include<cstring> #define MAXN 1000 #define INF 0xfffffff using namespace std; int n,m,s,e,val; int sum=0; void prim(); int w[MAXN][MAXN]; int mst[MAXN]; int lowcost[MAXN]; int main() { memset(w,0x7f,sizeof(w)); cin>>n>>m; for(int i=1;i<=m;i++) { cin>>s>>e>>val; w[s][e]=val; w[e][s]=val; } prim(); cout<<sum<<endl; return 0; } void prim() { for(int i=2;i<=n;i++) { lowcost[i]=w[1][i]; mst[i]=1; } mst[1]=0; for(int i=2;i<=n;i++) { int min=0x7f; int minid=0; for(int j=2;j<=n;j++) { if(lowcost[j]<min&&lowcost[j]!=0) { min=lowcost[j]; minid=j; } } // cout<<"V"<<mst[minid]<<"-V"<<minid<<"="<<min<<endl;sum+=min; lowcost[minid]=0; for(int j=2;j<=n;j++) { if(w[minid][j]<lowcost[j]) { lowcost[j]=w[minid][j]; mst[j]=minid; } } } }
2.Kruskal
#include<bits/stdc++.h> using namespace std; int n,m,cnt=0,f[6000]; long long ans=0; struct p { int start; int end; int val; }line[200011]; int find(int x) { if(f[x]!=x) f[x]=find(f[x]); return f[x]; } bool judge(int x,int y) { x=find(x); y=find(y); if(x==y) return true; else return false; } void merge(int x,int y) { x=find(x); y=find(y); f[x]=y; } bool cmp(p n1,p n2) { return n1.val<n2.val; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) f[i]=i; for(int i=1;i<=m;i++) cin>>line[i].start>>line[i].end>>line[i].val; sort(line+1,line+m+1,cmp); for(int i=1;i<=m;i++) { int u=find(line[i].start); int v=find(line[i].end); if(judge(u,v)) continue; merge(u,v); cnt++; ans+=line[i].val; if(cnt==n-1) break; } if(cnt==n-1) cout<<ans<<endl; else cout<<"orz"<<endl; return 0; } //兩者區別:Prim在稠密圖中比Kruskal優,在稀疏圖中比Kruskal劣。Prim是以更新過的節點的連邊找最小值,Kruskal是直接將邊排序。 //兩者其實都是運用貪心的思路