Simple minimum spanning tree, smooth engineering, these three topics are to practice the minimum spanning tree.
Note that when judging whether there is a pathway, Kruskal can determine whether the ancestors of each point is the same, prim can determine whether each point is added to the set, that is, whether all visited. Prim algorithm to initialize the non-given edge to max Infinity ...
Code: (Kruskal)
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath > #include <vector> #include <set> #include <queue> #include <string> #include <algorithm > #include <utility> #include <functional> #define MAX 0x7fffffffusing namespace Std;int p[105];struct Node{int I,j,len;} Gra[10005];int find (int x) {return x = = P[x]? x:p[x] = Find (P[x]);} int cmp (const void *a,const void *b) {return (node *) a)->len-((node *) b)->len;} int m,n;void Kruskal () {int i,sum = 0;for (i=1; i<=m; i++) {int x = find (gra[i].i); int y = find (GRA[I].J); if (x! = y) {sum + = Gra[i].len;p[x] = y;}} int flag = 0;for (i=1; i<=n; i++) {if (Find (1)! = Find (i)) {flag = 1;break;}} if (flag) cout << "?" << endl;elsecout << sum << endl;return;} int main () {int i,j,a,b,c;while (cin >> m >> n,m) {for (i=1; i<=m; i++) {cin >> a >> b >> c;gr a[i].i = A;GRA[I].J = B;gra[i].len = C;} for (I=1; i<=n; i++) p[i] = I;qsort (Gra+1,m,sizeof (gra[0]), CMP); Kruskal ();} return 0;}
Code: (PRIM)
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath > #include <vector> #include <set> #include <queue> #include <string> #include <algorithm > #include <utility> #include <functional> #define MAX 0x7fffffffusing namespace Std;int gra[105][105]; int M,n;void Prim () {int visit[105],i,j,now,min,sum = 0;int D[105];memset (visit,0,sizeof (visit)); for (i=1; i<=n; i++) D[i] = max;d[1] = 0;visit[1] = 1,now = 1;for (i=2; i<=n; i++) {for (j=1; j<=n; j + +) if (!visit[j] && d[j]>gra[ NOW][J]) d[j] = Gra[now][j]; min = Max;for (j=1; j<=n; j + +) if (!visit[j] && min > d[j]) min = D[now = J];visit[now] = 1;sum + = D[now]; }int flag = 0;for (i=1; i<=n; i++) {if (!visit[i]) {flag = 1;break;}} if (flag) cout << "?" << endl;elsecout << sum << Endl;} int main () {int i,j,a,b,c;while (cin >> m >> n,m) {for (i=1; i<=n; i++) for (j=1; j<=n; j + +) Gra[i][j] = Max;fo R (i=1; i<=m; i++) {cin >> a >> b >> c;gra[a][b] = gra[b][a] = c;} Prim ();} return 0;}
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
HDU 1863 unblocked Project Kruskal | | Prim