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 |
一个Prim算法引来的血案,大牛帮我一下,为什么测试数据都对了,可是总是WA#include <iostream> using namespace std; // 找出最小权集合中的最小权 int findMinEdge(int minCost[], int n) { int i; int minIndex = 0; while (minCost[minIndex] == 0) { minIndex++; } for (i=minIndex+1; i<=n-1; i++) { if (minCost[i] < minCost[minIndex] && minCost[i] != 0) { minIndex = i; } } return minIndex; } int main() { const bool VISIT = true; const bool UNVISIT = false; const int N = 27; int n; int i,j; int edges,cost; char a,b; int minCost[N] = {0}; // 当前MST到各未访问顶点的最小权 int matrix[N][N] = {0}; bool flag[N]; // 用来标记顶点是否被访问过 int minSum ; int minIndex; while (cin>>n && n!=0) { minSum = 0; for (i=0; i<=n-1-1; i++) { cin>>a>>edges; for (j=0; j<=edges-1; j++) { cin>>b>>cost; matrix[a-'A'][b-'A'] = cost; matrix[b-'A'][a-'A'] = cost; } } for (i=0; i<=n-1; i++) // 第一次访问第一个顶点 { minCost[i] = matrix[0][i]; flag[i] = UNVISIT; } flag[0] = VISIT; for (i=0; i<=n-1-1; i++) { minIndex = findMinEdge(minCost, n); // 访问权最小的顶点 minSum += minCost[minIndex]; minCost[minIndex] = 0; flag[minIndex] = VISIT;// 标志已经访问过 for (j=0; j<=n-1; j++) // 访问后,再一次处理minCost,求得当前MST到所有未访问的顶点最小权 { if (matrix[minIndex][j] !=0) { if (matrix[minIndex][j]<minCost[j]) { minCost[j] = matrix[minIndex][j]; } else if (matrix[minIndex][j]>minCost[j] && flag[j]==UNVISIT && minCost[j]==0) { minCost[j] = matrix[minIndex][j]; } } } } cout<<minSum<<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