还是畅通工程 HDU - 1233
2017-08-12 11:52
330 查看
浙大计算机研究生复试上机考试-2006年
prim 算法是选一个结点,加入集合,不断找距离集合最近的点加入集合
上一篇是克鲁斯卡尔求最小生成树
prim用邻接矩阵,更适用于稠密图
克鲁斯卡尔更适用于稀疏图
prim 算法是选一个结点,加入集合,不断找距离集合最近的点加入集合
上一篇是克鲁斯卡尔求最小生成树
prim用邻接矩阵,更适用于稠密图
克鲁斯卡尔更适用于稀疏图
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<set> #include<stack> #include<queue> #include<algorithm> // cout << " === " << endl; using namespace std; typedef long long ll; const int maxn = 100 + 7, INF = 0x3f3f3f3f, mod = 1e9+7; int n, m, x, y, d; int a[maxn][maxn], vis[maxn]; void init() { memset(vis, 0, sizeof vis); memset(a, INF, sizeof a); for(int i = 0; i < m; ++i) { scanf("%d%d%d", &x, &y, &d); a[x][y] = a[y][x] = d; } } void prim() { vis[1] = 1; int ans = 0; while(1) { int v = -1; for(int i = 2; i <= n; ++i) { if(!vis[i] && (v == -1 || a[1][v] > a[1][i])) v = i; } if(v == -1) break; ans += a[1][v]; vis[v] = 1; for(int i = 1; i <= n; ++i) a[1][i] = min(a[v][i], a[1][i]); } cout << ans << endl; } int main() { while(scanf("%d", &n) != EOF && n) { m = n * (n-1) / 2; init(); prim(); } return 0; }
相关文章推荐
- hdu1233 还是畅通工程 最小生成树(kruskal算法)
- 还是畅通工程 (HDU 1233)
- HDU 1232 畅通工程 & HDU 1233 还是畅通工程
- hdu 1233 还是畅通工程
- HDU 1233-还是畅通工程
- hdu1233-还是畅通工程
- hdu 1233 还是畅通工程--最小生成树prim
- HDU 1233 还是畅通工程
- HDU 1233 还是畅通工程 (自己种的第一棵最小生成树)
- hdu 1233 还是畅通工程
- HDU - 1233 还是畅通工程
- hdu 1233 还是畅通工程
- HDU - 1233 - 还是畅通工程
- HDU 1233 还是畅通工程
- hdu 1233:还是畅通工程
- HDU - 1233 还是畅通工程(Kruskal - MST)
- HDU 1233 还是畅通工程
- hdu 1233 还是畅通工程 (最小生成树,prim,优先队列,kruskal并查集)
- HDU-1233 还是畅通工程(prim)
- HDU 1233 还是畅通工程 最小生成树K算法 并查集