算法提高之新的开始
-
核心思想:超级源点 + 最小生成树
-
把所有建发电站的花费看作一个超级发电站的电缆费用
-
这样从超级源点开始做最小生成树即可
-
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 310; int w[N][N]; int dist[N]; int n; bool st[N]; int prim() { memset(dist,0x3f,sizeof dist); dist[0] = 0; int res=0; for(int i=0;i<=n;i++) { int t = -1; for(int j=0;j<=n;j++) if(!st[j] && (t == -1 || dist[t] > dist[j])) t = j; st[t] = true; res += dist[t]; for(int j=0;j<=n;j++) dist[j] = min(dist[j] , w[t][j]); } return res; } int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>w[0][i]; //从超级源点连 w[i][0] = w[0][i]; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>w[i][j]; cout<<prim()<<endl; }