Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
C++ Prim算法AC代码//题目要求:给出每两个村庄之间的距离矩阵,将所有村庄连接起来且总长度最短,输出连接村庄后最长的那条路 //也就是构建最小生成树求生成树里最长的一条边 #include <iostream> using namespace std; int n; //村庄数 int G[505][505]; //邻接矩阵 int inTree[505]; //节点是否已经在生成树里 int distances[505];//节点到生成树最短距离 int Prim() { int maxLen = 0; inTree[1] = 1; //先把第一个节点加入生成树 for (int i = 1; i <= n; i++) { distances[i] = G[1][i]; //更新最短距离数组 } for (int k = 0; k < n - 1; k++) { //要把剩下n-1个节点加入到生成树里 int tempLen = 70000; //随便找个比题目给出的距离最大值还大的数 int tempIndex = -1; for (int m = 1; m <= n; m++) { if (!inTree[m] && distances[m] < tempLen) { //找出不在生成树里的距离生成树最近的节点 tempLen = distances[m]; tempIndex = m; } } inTree[tempIndex] = 1; //加入生成树 if(maxLen < tempLen) //用于更新生成树里最长的边 maxLen = tempLen; for (int p = 1; p <= n; p++) { if (!inTree[p] && distances[p] > G[tempIndex][p]) //更新最短距离数组 distances[p] = G[tempIndex][p]; } } return maxLen; } int main() { int cases = 0; cin >> cases; while (cases--) { cin >> n; memset(G, 0, sizeof(G)); memset(inTree, 0, sizeof(inTree)); memset(distances, 0, sizeof(distances)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> G[i][j]; } } int res = Prim(); cout << res << endl; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator