标签:
题目链接:http://poj.org/problem?id=2485
解题报告:
#include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> using namespace std; #define NUM 1000 const int maxint=10000000; int c[NUM][NUM]; ///邻接矩阵 int ans=maxint; int Prim(int n,int c[][NUM]) { int lowcost[NUM]; ///权 memset(lowcost,maxint,sizeof(lowcost)); int closest[NUM]; ///节点 int s[NUM]= {false}; ///标记 ///初始化数组 for(int i=1; i<=n; i++) { lowcost[i]=c[1][i]; closest[i]=1; s[i]=false; ans=min(lowcost[i],ans); } ///从顶点v1开始 s[1]=true; ///处理其余n-1个顶点 for(int i=1; i<n; i++) { ///在未处理的节点中,找最小权的节点 int min=maxint; int j=1; ///节点 for(int k=2; k<=n; k++) { if(lowcost[k]<min&&(!s[k])) { min=lowcost[k]; j=k; } } ans=max(ans,min); //printf("%d %d\n",closest[j],j); ///加入节点到解集中 s[j]=true; ///根据新的节点,更新数组lowcost,和,closest for(int k=2; k<=n; k++) { if((c[j][k]<lowcost[k])&&(!s[k])) { lowcost[k]=c[j][k]; closest[k]=j; } } } return ans; } int main(void) { int test; cin>>test; while(test--) { int n; cin>>n; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { cin>>c[i][j]; if(c[i][j]==0) c[i][j]=maxint; } cout<<Prim(n,c)<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/TreeDream/p/5385028.html