当前位置: 代码迷 >> 综合 >> NYOJ 布线问题 prim
  详细解决方案

NYOJ 布线问题 prim

热度:82   发布时间:2024-01-11 16:29:17.0
 //普通邻接矩阵  时间复杂度 O(v*e)
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define INF 999999
int v;
int map[505][505];
int lowcost[505];
int visit[1000];
int prim( int start )
{int min, choose, ans;ans = 0;for( int i = 1; i <= v; i++ ){lowcost[i] = map[start][i];}lowcost[start] = 0;visit[start] = 1;for( int i = 1; i <= v-1; i++ ){min = INF;for( int j = 1; j <= v; j++ ){if( !visit[j] && lowcost[j] >= 0 && lowcost[j] < min ){min = lowcost[j];choose = j;}}ans += lowcost[choose];visit[choose] = 1;for( int j = 1; j <= v; j++ ){if( !visit[j] && map[choose][j] < lowcost[j] )lowcost[j] = map[choose][j];						}}return ans;	
}
int main( )
{int T, e, min, a, b, w, num;scanf( "%d", &T );while( T-- ){memset( map, 0, sizeof(map) );memset( visit, 0, sizeof(visit) );memset( lowcost, -1, sizeof(lowcost) );	scanf( "%d%d", &v, &e );for( int i = 0; i < e; i++ ){scanf( "%d %d %d\n", &a, &b, &w );if( map[a][b] ){if( map[a][b] > w ){map[a][b] = w;map[b][a] = w;}}else{map[a][b] = w;map[b][a] = w;}}min = INF;for( int i = 0; i < v; i++ ){scanf( "%d", &num );if( num < min )min = num;}printf( "%d\n", min+prim( 1 ) );		}return 0;
}  


优先队列+邻接矩阵  优先队列 时间复杂度  O( nlog(n) )

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#define MAX 505
#define INF 9999999
#define CLR(arr,val) memset(arr,val,sizeof(arr))using namespace std;
typedef struct a
{int dis, v;friend bool operator < ( const struct a &n1, const struct a &n2 ){return n1.dis > n2.dis;}
}node;
int n;
int map[MAX][MAX];
int vis[MAX];
int lowcost[MAX];
inline void init()
{for( int i = 0; i < MAX; i++ ){lowcost[i] = INF;for( int j = 0; j < MAX; j++ )map[i][j] = INF;}CLR( vis, 0 );  
};
int prim( int start )
{int sum = 0;node pre, cur;priority_queue<node> Q;lowcost[start] = 0;pre.dis = 0;pre.v = start;Q.push( pre );while( !Q.empty() ){pre = Q.top();Q.pop();if( vis[pre.v] )continue;sum += pre.dis;vis[pre.v] = 1;for( int i = 1; i <= n; i++ ){if( !vis[i] &&  map[pre.v][i] < lowcost[i] ){lowcost[i] = map[pre.v][i];cur.dis = lowcost[i];cur.v = i;Q.push( cur );}}}return sum;
}
int main()
{int T, e, a, b, w, num, min;scanf( "%d", &T );  while( T-- )  {  init();scanf( "%d%d", &n, &e );  for( int i = 0; i < e; i++ )  {  scanf( "%d %d %d\n", &a, &b, &w );  if( map[a][b] )  {  if( map[a][b] > w )  {  map[a][b] = w;  map[b][a] = w;  }  }  else  {  map[a][b] = w;  map[b][a] = w;  }  }  min = INF;  for( int i = 0; i < n; i++ )  {  scanf( "%d", &num );  if( num < min )  min = num;  } printf( "%d\n", prim( 1 ) + min );}return 0;
}


  相关解决方案