| ||||||||||
| 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 | |||||||||
Re:PRIM算法wrong了一天了 郁闷了。在线求高人指点。In Reply To:PRIM算法wrong了一天了 郁闷了。在线求高人指点。 Posted by:dakecaoxin at 2010-02-07 19:35:06 > #include <iostream>
> #define N 2300
> int g[N][N]={0};
> using namespace std;
> int main()
> {
> int lowcost[N],closest[N];
> int i,j,k,min;
> int max=0;
> int n;
> int m;
> int v1,v2,dis;
> while(cin>>n>>m){
>
> memset(g,-1,N*N*sizeof(int));
> max=0;
> //scanf("%c",&v1);
> //跟新最小边,生成邻接矩阵
> for(j=1;j<=m;j++){
> cin>>v1>>v2>>dis;
> if(g[v1][v2]==-1||g[v1][v2]>dis||g[v2][v1]>dis){
> g[v1][v2]=dis;
> g[v2][v1]=dis;
> }
> }
> for(i=1;i<=n;i++){
> g[i][i]=0;
> }
> for(i=1;i<=n;i++){
> for(j=1;j<=n;j++){
> // printf("%d ",g[i][j]);
> }
> // cout << endl;
> }
>
>
> //prim算法
> for(i=2;i<=n;i++) //n个顶点,n-1条边
> {lowcost[i]=g[1][i]; //初始化
> closest[i]=1; //顶点未加入到最小生成树中
> }
> lowcost[1]=0; //标志顶点1加入U集合
> for(i=2;i<=n;i++) //形成n-1条边的生成树
> {min=10000;
> k=0;
> for(j=2;j<=n;j++) //寻找满足边的一个顶点在U,另一个顶点在V的最小边
> if((lowcost[j]<min)&&(lowcost[j]!=0)&&(lowcost[j]!=-1))
> {min=lowcost[j];
> k=j;
> }
> if(max<min)max=min;
> //printf("(%d,%d)%d\t",closest[k],k,min);
> lowcost[k]=0; //顶点k加入U
> for(j=2;j<=n;j++) //修改由顶点k到其他顶点边的权值
> if(g[k][j]!=-1&&g[k][j]<lowcost[j]||(g[k][j]>0&&lowcost[j]==-1))
> {
> // cout<<endl;
> //cout<<g[k][j]<<" "<<lowcost[j]<<" "<<k<<endl;
> lowcost[j]=g[k][j];
> closest[j]=k;
> }
> // printf("\n");
> }
>
>
>
>
> cout<<max<<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