poj1287解题报告

对于学过图和Prim算法的人来说,此题是一道不折不扣的水题,尤其是输入范围限定在了50之内,所以即便我用了O(n^3)的算法也只用了16MS就AC了。

前期建图,我用的是邻接矩阵,当两个节点有多个路径时选择最小的录入。

建完图后开始对图操作,使用的是Prim算法,其精髓是选取与集合A相接的最小边,其中集合A代表已选择节点。有疑问的可以百度Prim或参考算法导论的相关章节

具体代码如下,Memory 180K  Time  16MS

#include
#include
#include
using namespace std;

const int maxn=50+10;
int G[maxn][maxn];
bool vis[maxn];
int p,r;

struct Node
{
    int p[maxn];
    int length;
}v;

void init(struct Node &s)
{
    s.length=1;
}

int main()
{
    while(scanf("%d",&p) && p)
    {
        int x,y,d;
        scanf("%d",&r);
        if(r==0) { printf("0\n"); continue; }
        memset(G,0,sizeof(G));   //一定不要忘了初始化
        memset(vis,false,sizeof(vis));
        init(v);
        for(int i=0;iG[k][j])
                    {
                        mark=j;
                        minn=G[k][j];
                    }
                }
            }
            ans+=minn;
            vis[mark]=true;
            v.p[v.length++]=mark;
        }
        printf("%d\n",ans);
    }
    return 0;
}

错误代码如下:

#include
#include
#include
using namespace std;

const int maxn=50+10;
int G[maxn][maxn];
bool vis[maxn];

int p,r;

int main()
{
    while(scanf("%d",&p) && p)
    {
        int x,y,d;
        scanf("%d",&r);
        if(r==0) { printf("0\n"); continue; }
        memset(G,0,sizeof(G));   //一定不要忘了初始化
        memset(vis,false,sizeof(vis));
        for(int i=0;iG[j][i])
                {
                    mark=j;
                    minn=G[j][i];
                }
            }
            ans+=minn;
            vis[mark]=true;
        }
        printf("%d\n",ans);
    }
    return 0;
}

错误原因:只是选取了每个节点的最小相邻边但并不能保证其将所有节点都连接起来,会出现1与2连,3与4连的错误情况(题中要求1234都相连)

你可能感兴趣的:(解题报告)