| ||||||||||
| 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算法wrong了一天了 郁闷了。在线求高人指点。#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