| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 373 人关注过本帖
标题:求大神帮忙,最小生成树输出有问题,,,在线等
只看楼主 加入收藏
wu2304211
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-3-10
结帖率:0
收藏
 问题点数:0 回复次数:1 
求大神帮忙,最小生成树输出有问题,,,在线等
#include <stdio.h>
#define MaxInt 32767
#define MVNum 100
#define OK 1
typedef char VerTexType;     //假设顶点的数据类型为字符型
typedef int ArcType;     //假设边的权值类型为整型
typedef struct{
 VerTexType vexs[MVNum];         //顶点表
 ArcType arcs[MVNum][MVNum];     //邻接矩阵
 int vexnum,arcnum;                     //图的当前点数和边数
}AMGraph;
//辅助数组Edges的定义
struct{
    VerTexType Head;                        //边的始点
    VerTexType Tail;                        //边的终点
    ArcType lowcost;                        //边上的权值
}Edge[(MVNum*(MVNum -1))/2];

int Vexset[MVNum];                            //辅助数组Vexset的定义
int LocateVex(AMGraph G,VerTexType v)
{
 //确定点v在G中的位置
 int i;
 for(i=0;i<G.vexnum;++i)
 {
  if(G.vexs[i]==v)
   return i;
 }
}
int CreateUND(AMGraph G)
{

    //采用邻接矩阵表示法,创建无向网G
    int i,j,k;
    VerTexType v1=0,v2=0;
    ArcType w;
    scanf("%d",&G.vexnum);
G.arcnum=G.vexnum*G.vexnum;
    for(i=0;i<G.vexnum;++i)     //初始化邻接矩阵
        for(j=0;j<G.vexnum;++j)
            G.arcs[i][j]=MaxInt;
    Sort(G);
          for(k=0;k<G.arcnum;++k)     //构造邻接矩阵
 {
        scanf("%d",&w);
        v1++;
        v2++;
        i=LocateVex(G,v1);     //调用函数,确定v1在G中的位置
        j=LocateVex(G,v2);     //调用函数,确定v2在G中的位置
        G.arcs[i][j]=w;
}
}
int Sort(AMGraph G){
    int m=G.arcnum-2;
    int flag = 1;
    while((m > 0) && flag == 1){
        flag = 0;
        int j;
        for(j=0;j<=m;j++){
            if(Edge[j].lowcost > Edge[j+ 1].lowcost){
                flag = 1;
                VerTexType temp_Head = Edge[j].Head;{
                Edge[j].Head = Edge[j+ 1].Head;
                Edge[j + 1].Head = temp_Head;
                VerTexType temp_Tail = Edge[j].Tail;
                Edge[j].Tail = Edge[j+ 1].Tail;
                Edge[j + 1].Tail = temp_Tail;
                ArcType temp_lowcost = Edge[j].lowcost;
                Edge[j].lowcost = Edge[j+ 1].lowcost;
                Edge[j + 1].lowcost = temp_lowcost;
            }//if
        }//for
        --m;
    }//while
}//Sort
}
void MiniSpanTree_Kruskal(AMGraph G){
    //无向网G以邻接矩阵形式存储,构造G的最小生成树T,输出T的各条边
    int i , j , v1 , v2 , vs1 , vs2;
    Sort(G);                                             //将数组Edge中的元素按权值从小到大排序
    for(i = 0; i < G.vexnum; ++i)                         //辅助数组,表示各顶点自成一个连通分量
        Vexset[i] = i;
    for(i = 0; i < G.arcnum; ++i){
        //依次查看排好序的数组Edge中的边是否在同一连通分量上
        v1 =LocateVex(G, Edge[i].Head);                 //v1为边的始点Head的下标
        v2 =LocateVex(G, Edge[i].Tail);                 //v2为边的终点Tail的下标
        vs1 = Vexset[v1];                               //获取边Edge[i]的始点所在的连通分量vs1
        vs2 = Vexset[v2];                               //获取边Edge[i]的终点所在的连通分量vs2
        if(vs1 != vs2){                                 //边的两个顶点分属不同的连通分量
            printf("%d%d\n",Edge[i].Head,Edge[i].Tail);        //输出此边
            for(j = 0; j < G.vexnum; ++j)                  //合并vs1和vs2两个分量,即两个集合统一编号
                if(Vexset[j]==vs2) Vexset[j] = vs1;    //集合编号为vs2的都改为vs1
        }//if
    }//for
}//MiniSpanTree_Kruskal
int main()
{
 AMGraph G;
 CreateUND(G);
 MiniSpanTree_Kruskal(G);
}

[ 本帖最后由 wu2304211 于 2015-7-2 10:55 编辑 ]
搜索更多相关主题的帖子: include 在线 
2015-07-02 10:52
luoye1994
Rank: 2
等 级:论坛游民
帖 子:57
专家分:58
注 册:2015-6-29
收藏
得分:0 
你写的int CreateUND(AMGraph G)函数中,调用的Sort(G)没有申明;你要知道被调的函数只用写在你写的函数的上边才可以不用申明,还有你写的int **()函数,要有一个返回值。你改改试试
2015-07-02 11:13
快速回复:求大神帮忙,最小生成树输出有问题,,,在线等
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031254 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved