AcWing 1141. 區域網(Prim最小生成樹)
阿新 • • 發佈:2021-07-20
AcWing 1141. 區域網(Prim最小生成樹)
- 最小生成樹prim做法,一點找一條最短的邊,並把其他邊給扔掉
- 雙向網線相當於是無向圖
- 此題先統計一下所有路徑長,再把它減去prim返回的路徑長可以得到最多科節省的資金
- 相當於a-b=c,儘可能讓b小點,從而使c大點
#include<bits/stdc++.h> using namespace std; int n,k,sum=0; const int N = 1e2+10,M =2e2+10,INF = 0x3f3f3f3f; int g[N][N]; int prim() { int res=0; int dist[N]; bool used[N]; memset(dist,0x3f,sizeof(dist)); memset(used,false,sizeof(used)); for(int i=0;i<n;i++) { int t=-1; for(int j=1;j<=n;j++) { if( (!used[j]) && (t==-1||dist[t]>dist[j]) ) t=j; } if(i&&dist[t]!=INF)res+=dist[t]; //當i=0時,只是對路徑或者說是dist陣列進行預熱 //可能有不連通的存在 for(int j=1;j<=n;j++) dist[j] = min(dist[j],g[t][j]); used[t] = true;//用完不要再用了 } return res; } int main() { memset(g,0x3f,sizeof(g)); cin>>n>>k; for(int i=0;i<k;i++) { int I,J,m; cin>>I>>J>>m; g[I][J]=g[J][I]=min(g[I][J],m);//處理重邊和雙向路徑 sum+=m; } cout<<sum-prim(); return 0; }