poj 2485 修建公路

来源:互联网 发布:8080端口服务打开 编辑:程序博客网 时间:2024/04/27 15:56

继续复习prim算法

注意本题的要求是输出最小生成树中的最大边

#include <iostream>#include <sstream>#include <cstdio>#include <cstring>#include <cmath>#include <string>#include <vector>#include <set>#include <cctype>#include <algorithm>#include <cmath>#include <deque>#include <queue>#include <map>#include <queue>#include <list>#include <iomanip>using namespace std;                                               //////const int INF =  20000000;   #define maxn 505   #define max(a,b)(a>b?a:b)///int T;int N;int cost[maxn][maxn];//邻接矩阵,不能到达置为infint lowc[maxn];//记录某点出发到各点的数值bool vis[maxn];//是否被加入MST中int prim(){int i, j, s;int minc;int ans = 0;memset(vis, false, sizeof(vis));//初始化第一个结点和花费数组vis[1] = true;for (i = 2; i <= N; i++)lowc[i] = cost[1][i];         //对剩余结点进行迭代for (i = 2; i <= N; i++){minc = INF;s = -1;//当前最小结点编号for (j = 1; j <= N; j++){if (0 == vis[j] && minc > lowc[j]){minc = lowc[j];s = j;}}if (ans < minc)ans = minc;//找到新的MST边的数值更大则更新vis[s] = true;for (j = 1; j <= N; j++){if (0 == vis[j] && lowc[j] > cost[s][j])lowc[j] = cost[s][j];}}return ans;}int main(){///int i, j;scanf("%d", &T);while (T--){cin >> N;//建图for (i = 1; i <= N; i++)for (j = 1; j <= N; j++)scanf("%d", &cost[i][j]);int ans = prim();printf("%d\n", ans);}///    return 0;}