Prim算法的實現

好吧,這是我寫的Prim算法,直接上代碼:

/*測試數據

6 10
1 2 6
1 3 1
1 4 5
2 3 5
3 4 5
2 5 3 
3 5 6
3 6 4
4 6 2
5 6 6

*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100  //定義最大頂點數N

const int MaxInt = 99999999;

int map[N][N], low[N], visited[N], n;  //map數組存儲圖的鄰接矩陣形式的權值
                            //low數組記錄每2個結點間最小權值,visited數組標記是否已被訪問

int prim()
{
	int i, j, pos, min;   // pos爲位置
	int result = 0;

	memset(visited, 0, sizeof(visited));
	visited[1] = 1, pos = 1;  // 從某點開始, 分別標記和記錄該點


	for (i = 1; i <= n; i++)// 第一次給low數組賦值
		if(i != pos)
			low[i] = map[pos][i];
		
	printf("路徑爲:%d->", pos);

	for (i = 1; i < n; i++)// 再運行n-1次(給low數組賦值的操作)
	{
		// 找出最小權值並記錄位置
		min = MaxInt;  
		for (j = 1; j <= n; j++)
			if(visited[j] == 0 && min > low[j])
			{
				min = low[j];
				pos = j;
			}
		printf("%d->", pos);
		result += min;// 最小權值累加
		visited[pos] = 1; // 標記該點

		//更新權值
		for (j = 1; j <= n; j++)
			if(visited[j] == 0 && low[j] > map[pos][j])
				low[j] = map[pos][j];
	}

	return result;
}

int main()
{
	int i, j, m, s, e, w;

	while(scanf("%d %d", &n, &m) != EOF)
	{
		// 所有權值初始化爲最大
		for(i = 1; i <= n; i++)
			for(j = 1; j <= n; j++)
				map[i][j] = MaxInt;

		for (i = 0; i < m; i++)
		{
			scanf("%d %d %d", &s, &e, &w);
			map[s][e] = map[e][s] = w;
		}
			
		printf("\n總權值 = %d\n", prim());
	}

	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章