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 |
我的代码(有注释,适合新手,大牛们莫鄙视,谢谢……)#include <iostream> using namespace std; int prim(int n) { int c[27][27]; int i,j,u; int roadnum; //邻接点的个数 int sum=0; int T[100]; //最小花费生成树的边集(权) int w[100]; //顶点i近邻相关联边的权集 int k; //最小生成树中边的个数 bool s[100]; //是否进入集合S int min; /*---------图的初始化-----------*/ for(i=0;i<n;i++) for(j=0;j<n;j++) { c[i][j]=1000000; //cout<<"c"<<"["<<i<<"]"<<"["<<j<<"]"<<c[i][j]<<endl; } for(i=0;i<n-1;i++) { char vn1; cin>>vn1; cin>>roadnum; if(roadnum==0) continue; else { char vn2; for(j=0;j<roadnum;j++) { cin>>vn2; cin>>c[vn1-65][vn2-65]; c[vn2-65][vn1-65]=c[vn1-65][vn2-65]; // 完整邻接二维数组 } } c[vn1-65][vn1-65]=0; } /*------------算法实现-----------------------------------------------*/ s[0]=true; //第一点放入集合S for(i=1;i<n;i++) //初始化集合N { w[i]=c[0][i]; //顶点i到近邻边的权 s[i]=false; //将除第一点外的点均放入N集 } k=0; for(i=1;i<n;i++) //执行n-1次搜索,将N中元素转移至S { u=0; min=100000; for(j=1;j<n;j++) { if(!s[j]&&w[j]<min) { u=j; min=w[j]; } } if(u==0) break; T[k++]=w[u]; //记录近邻边的权重 s[u]=true; //将所搜索的点放入S中 /*-----------------------更新N中顶点的近邻信息---------------------------------*/ for(j=1;j<n;j++) if(!s[j]&&c[u][j]<w[j]) w[j]=c[u][j]; } for(i=0;i<k;i++) { //cout<<T[i]<<endl; sum=sum+T[i]; } // cout<<T[0]<<" "<<T[1]<<" "<<T[2]<<" "<<T[3]<<endl; // cout<<c[0][8]<<" "<<c[6][4]<<" "<<c[4][6]<<endl; return sum; } int main() { //freopen("in.txt","r",stdin); int n; while(cin>>n&&n!=0) { printf("%d\n",prim(n)); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator