算法Prim + 虚拟原点
当我看到这一题的时候想到的是直接做一遍prim 然后再加上这点点中当发电站的最小值,结果wa了,后来想了想,如果这点
当发电站的费用都很小就直接做发电站了,所以呢我那种想法就错了,因此我看可以想象一个虚拟的超级发电站,让他和所有点建立一天虚拟边,那么这样再次用prim就过掉了~~
时间复杂度
参考文献
C++ 代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 310, INF = 1e9;
int g[N][N];
int dist[N];
bool st[N];
int money[N];
int n;
int ans;
void prim()
{
memset(dist, 0x3f, sizeof dist);
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;
if(i) ans += dist[t];
for(int j = 0; j <= n; j ++)
dist[j] = min(dist[j], g[t][j]);
}
}
int main()
{
cin >> n;
for(int i = 1, x; i <= n; i ++)
cin >> x, g[0][i] = x, g[i][0] = x;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
cin >> g[i][j];
prim();
cout << ans << endl;
return 0;
}
我想法跟你一样。。