HDU 1102 Constructing Roads
很好的最小生成树的模板题,由于用邻接矩阵存储的,故用prim算法比较方便。
AC code:
 prim
prim
1 #include <iostream> 2 using namespace std; 3 int n, q, sum; 4 const int MAX = 101; 5 const int INF = 100000; 6 int map[MAX][MAX], vis[MAX], dis[MAX]; 7 8 void init() 9 { 10 int i, j, tx, ty; 11 for(i = 1; i <= n; i++){ 12 for(j = 1; j <= n; j++) 13 scanf("%d", &map[i][j]); 14 } 15 scanf("%d", &q); 16 for(i = 1; i <= q; i++){ 17 scanf("%d%d", &tx, &ty); 18 map[tx][ty] = 0; 19 map[ty][tx] = 0; 20 } 21 } 22 void prim() 23 { 24 int i, j; 25 sum = 0; 26 memset(vis, 0, sizeof(vis)); 27 for(i = 1; i <= n; i++) 28 dis[i] = INF; 29 dis[1] = 0; 30 for(i = 1; i <= n; i++){ 31 int min = INF, pos = -1; 32 for(j = 1; j <= n; j++){ 33 if(dis[j] < min && !vis[j]){ 34 min = dis[j]; 35 pos = j; 36 } 37 } 38 vis[pos] = 1; 39 sum += min; 40 for(j = 1; j <= n; j++){ 41 if(map[pos][j] < dis[j]) 42 dis[j] = map[pos][j]; 43 } 44 } 45 } 46 int main() 47 { 48 while(scanf("%d", &n) != EOF) 49 { 50 init(); 51 prim(); 52 printf("%d\n", sum); 53 } 54 return 0; 55 }
 
                    
                 

