kurskal算法: #include <iostream> #include <fstream> #include <sstream> #include <algorithm> #include <string> #include <set> #include <map> #include <utility> #include <queue> #include <stack> #include <list> #include <vector> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> using namespace std; const int MAX = 105; int st[105]; int N, x, y, w; struct vv { int x, y, val; void set ( int a, int b, int w ) { x=a,y=b,val=w; } }v[10005]; bool cmp ( const vv &a, const vv &b ) { return a.val < b.val; } void creat () { for ( int i = 0; i <= N; ++ i ) st[i] = i; } int find ( int x ) { return x != st[x] ? find ( st[x] ) : x; } void merge ( int x, int y ) { x = find ( x ); y = find ( y ); if ( x == y ) return; st[y] = x; } int main () { while ( scanf ( "%d", &N )==1) { creat (); memset ( v, 0, sizeof ( v ) ); int c = 0; for ( int i = 1; i <= N; ++ i ) { for ( int j = 1; j <= N; ++ j ) { scanf ( "%d", &w ); v[c++].set ( i,j,w ); } } sort ( v, v + c, cmp ); int sum = 0; for ( int i = 0 ; i < c; ++ i ) { if ( find ( v[i].x ) != find ( v[i].y ) ) { sum += v[i].val; merge ( v[i].x, v[i].y ); } } printf ( "%d/n", sum ); } return 0; }