锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
棰樼洰鍦板潃:
http://poj.org/problem?id=1258
棰樼洰鎻忚堪:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 16557 | Accepted: 6745 |
Description
Input
Output
Sample Input
4 0 4 9 21 4 0 8 17 9 8 0 16 21 17 16 0
Sample Output
28
棰樼洰鍒嗘瀽 :
MST 姘撮, 鐢↘RUSKARL 鎴?PRIM 杞繪澗鑳借繃.
浠g爜濡備笅 :
/* Mail to : miyubai@gamil.com MyBlog : http://baiyun.me Link : http://www.cnblogs.com/MiYu || http://www.shnenglu.com/MiYu Author By : MiYu Test : 1 Complier : g++ mingw32-3.4.2 Program : Agri-Net Doc Name : PKU_1258 */ //#pragma warning( disable:4789 ) #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; }