锘??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://m.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;
}