最小生成树

来源:互联网 发布:nba2k online球星数据 编辑:程序博客网 时间:2024/05/16 08:58
#define MAXN 101int n, ret;int map[MAXN][MAXN];void prim(){int closet[MAXN];int dist[MAXN];int i, j;for ( i=0; i<n; i++){closet[i] = 0;dist[i] = map[0][i];}closet[0] = 1;int u, min;for ( i=1; i<n; i++){min = 100001;for ( j=1; j<n; j++){if ( ! closet[j] && dist[j] < min && dist[j] > 0){u = j;min = dist[j];}}closet[u] = 1;ret += min;for ( j=1; j<n; j++){if (! closet[j] &&  map[u][j] < dist[j] )dist[j] = map[u][j];}}}

#include <stdio.h>#include <queue>using namespace std;#define Maxv 100+5typedef struct{int v1,v2,len;}Node;bool operator > (Node a,Node b){if( a.len > b.len )return true;return false;}int dis[Maxv][Maxv];int fa[Maxv];int Getfa(int i){if( fa[i] == i )   return i;fa[i] = Getfa(fa[i]);return fa[i];}int main(){int sum;priority_queue< Node,vector<Node>,greater<Node> > Q;  //返回最小数int vn,i,j;  while( scanf( "%d" , &vn ) != EOF ){//输入图部分for( i = 1 ; i <= vn ; i++ )for( j = 1 ; j <= vn ; j++ )scanf( "%d" , &dis[i][j] );for( i = 1 ; i <= vn ; i++ )   fa[i] = i;while( !Q.empty() )  Q.pop();//把每条边压入堆中for( i = 1 ; i < vn ; i++ )for( j = i+1 ; j <= vn ; j++ )if( dis[i][j] ){Node e;e.v1 = i , e.v2 = j , e.len = dis[i][j];Q.push(e);}sum = 0;while( Q.size() != 0 ){Node e;e = Q.top();Q.pop();if( Getfa(e.v1) != Getfa(e.v2) ){sum += e.len;fa[Getfa(e.v2)] = Getfa(e.v1);}}printf( "%d\n" , sum );    //所需的最小值}return 0;}