http://poj.org/problem?id=1287
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 8028 | Accepted: 4417 |
Description
Input
Output
Sample Input
1 0 2 3 1 2 37 2 1 17 1 2 68 3 7 1 2 19 2 3 11 3 1 7 1 3 5 2 3 89 3 1 91 1 2 32 5 7 1 2 5 2 3 7 2 4 8 4 5 11 3 5 10 1 5 6 4 2 12 0
Sample Output
0 17 16 26
思路:最基本的prim,kruskal,但要注意的是有重边,所以用prim写的时候需要处理一下,kruskal的话就不需要了
kruskal
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; #define N 2100 #define INF 0x3f3f3f3f #define met(a, b) memset (a, b, sizeof(a)) struct node { int x, y, d; }stu[N]; bool cmp (node a, node b) { return a.d < b.d; } int n, m, f[60]; int Find (int x) { if (x!=f[x]) f[x] = Find (f[x]); return f[x]; } void kruskal () { int sum = 0; for (int i=0; i<m; i++) { int xx = Find (stu[i].x); int yy = Find (stu[i].y); if (xx != yy) { f[xx] = yy; sum += stu[i].d; } } printf ("%d\n", sum); } int main () { while (scanf ("%d", &n), n) { met (stu, 0); scanf ("%d", &m); for (int i=0; i<=n; i++) f[i] = i; for (int i=0; i<m; i++) scanf ("%d%d%d", &stu[i].x, &stu[i].y, &stu[i].d); sort (stu, stu+m, cmp); kruskal (); } return 0; }
prim
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; #define N 200 #define INF 0x3f3f3f3f #define met(a, b) memset (a, b, sizeof(a)) int g[N][N], dist[N], vis[N], n, m; void prim (int sa) { for (int i=1; i<=n; i++) dist[i] = g[sa][i]; met (vis, 0); dist[sa] = 0; vis[sa] = 1; int ans = 0; for (int i=1; i<=n; i++) { int minx = INF, Index = 0; for (int j=1; j<=n; j++) if (!vis[j] && dist[j] < minx) minx = dist[Index = j]; vis[Index] = 1; ans += dist[Index]; for (int j=1; j<=n; j++) if (!vis[j] && dist[j] > g[Index][j]) dist[j] = g[Index][j]; } printf ("%d\n", ans); } int main () { while (scanf ("%d", &n), n) { int x, y, d; scanf ("%d", &m); for (int i=1; i<=n; i++) { dist[i] = INF; for (int j=1; j<=n; j++) g[i][j] = INF; } while (m--) { scanf ("%d %d %d", &x, &y, &d); g[y][x] = g[x][y] = min (g[x][y], min (g[y][x], d)); } prim (1); } return 0; }