POJ 2485 公路

来源:互联网 发布:mac需要鼠标吗 编辑:程序博客网 时间:2024/04/27 17:54
#include<iostream>#include<fstream>using namespace std;/* 648K766MS*/static const int MAXNODES = 501;static const int MAXINT = ((unsigned)-1) >> 1;static int weigh[MAXNODES][MAXNODES];static int key[MAXNODES];static int isin[MAXNODES];static int cost;static int longest;static int n;//#define DEBUGvoid prim(){int i, j;key[1] = 0;isin[1] = 0;longest = 0;for (i = 2; i <= n; i++){key[i] = MAXINT;isin[i] = 0;}for (cost = 0, i = 1; i <= n; i++){int min = MAXINT;    int mini = -1;for(j = 1; j <= n; j++){if (!isin[j] && key[j] < min){min = key[j];mini = j;}}isin[mini] = 1;cost += min;if (min > longest)longest = min;for (j = 1; j <= n; j++){if (!isin[j] && weigh[mini][j] < key[j])key[j] = weigh[mini][j];}}}int main(){#ifdef DEBUGfstream cin("G:\\book\\algorithms\\acm\\Debug\\dat.txt");#endifint t;cin >> t;while (t-- > 0){int i, j;cin >> n;for (i = 1; i <= n; i++)for (j = 1; j <= n; j++)cin >> weigh[i][j];prim();cout << longest << "\n";}return 0;}

直接应用prim算法即可。和传统的最小生成树不同的在于所要求解的是最小代价中的最大值。

Prim算法的思想是贪心算法。算法的理论基础参加算法导论的23.2节。

Prim算法操作的对象是节点,邻接矩阵。算法过程和Dijkstra单源最短路径相似。

Prim算法的正确性的理解比Kruskal算法难。

原创粉丝点击