回 帖 发 新 帖 刷新版面

主题:求助:无向图的实现,并用Kruskal算法计算最小生成树

我在国内学过的C++课程完全是C,出国后教授根据我以前的课给了我这门基于C++的数据结构和算法的课程,结果发现完全不懂。

第二次作业周五就交,再交不出来就over了……特来求援……
麻烦大家帮忙……多谢了

CSCI 303 Homework #2 
Due Friday, October 6, 2006 

Implement the Graph ADT using a class template. Use the following code in your class declaration:


template < class T >
class Graph
{
private:
T * vertices;
unsigned int * edges;

public:
Graph(unsigned int numVertices);
void addVertex(unsigned int vertexNumber, const T & vertexData);
void addEdge(unsigned int vertex1, unsigned int vertex2);
void removeEdge(unsigned int vertex1, unsigned int vertex2);
bool hasEdge(unsigned int vertex1, unsigned int vertex2) const;
T getVertexData(unsigned int vertexNumber) const;
bool isConnected() const;
bool hasCycle() const;
bool isTree() const;
T operator[](unsigned int vertexNumber) const;
};


Make sure that each of your class methods is functional! Note that the operator[] method should have the same functionality as getVertexData.
Then implement a derived class called WeightedGraph in which each edge may be assigned a weight of type double. Supply a method that returns a minimum weight spanning tree using Kruskal's Algorithm, and find the asymptotic time-complexity of this method. Show your work. You may add members to the Graph class, but do not add variables which are for local use only. Make sure to add a copy constructor, operator=, and destructor. WeightedGraph also needs these methods. Make sure that your class is foolproof against all possible uses; in particular, perform bounds checking before attempting to access an array element, and throw exceptions when appropriate. Make sure that your hasCycle method checks all components of the graph, in case the graph is not connected.

回复列表 (共8个回复)

沙发

呵呵~~
图我还没有学呢.
作业在这儿是很少有人会帮做的,与其这样浪费时间,还不如自己好好想想怎么做.

板凳

偶在努力啃C++的书……
不过要追上课还是极度困难的……
上次堆寨的作业5个通宵才凑出来……
这次的,彻底没有想法了……
所以才没有办法的求助了啊……

3 楼

以前写的  你看看 可以改改
你可以参考一下
#include<stdio.h>
#include<stdlib.h>
#define M 20
#define MAX 20

typedef struct 
{
 int begin;
 int end;
 int weight;
}edge;

typedef struct
{
 int adj;
 int weight;
}AdjMatrix[MAX][MAX];

typedef struct
{
 AdjMatrix arc;
 int vexnum, arcnum;
}MGraph;
void CreatGraph(MGraph *);//函数申明 
void sort(edge* ,MGraph *);
void MiniSpanTree(MGraph *);
int  Find(int *, int );
void Swapn(edge *, int, int);
void CreatGraph(MGraph *G)//构件图
{
 int i, j,n, m;

 printf("请输入边数和顶点数:");
 scanf("%d %d",&G->arcnum,&G->vexnum);
 
    for (i = 1; i <= G->vexnum; i++)//初始化图
 {
  for ( j = 1; j <= G->vexnum; j++)
  {
   G->arc[i][j].adj = G->arc[j][i].adj = 0;
  }
 }

 for ( i = 1; i <= G->arcnum; i++)//输入边和权值 
 {
  printf("\n请输入有边的2个顶点");
  scanf("%d %d",&n,&m);
  while(n < 0 || n > G->vexnum || m < 0 || n > G->vexnum)
  {
   printf("输入的数字不符合要求 请重新输入:");
   scanf("%d%d",&n,&m);
  }
     
  G->arc[n][m].adj = G->arc[m][n].adj = 1;
  getchar();
  printf("\n请输入%d与%d之间的权值:", n, m);
  scanf("%d",&G->arc[n][m].weight);
 }
    
 printf("邻接矩阵为:\n");
 for ( i = 1; i <= G->vexnum; i++)
 { 
  for ( j = 1; j <= G->vexnum; j++)
  {
      printf("%d ",G->arc[i][j].adj);
  }
     printf("\n");
 }
}

void sort(edge edges[],MGraph *G)//对权值进行排序 
{
 int i, j;

 for ( i = 1; i < G->arcnum; i++)
 {
  for ( j = i + 1; j <= G->arcnum; j++)
  {
   if (edges[i].weight > edges[j].weight)
   {
    Swapn(edges, i, j);
   }
  }
 }
    
 printf("权排序之后的为:\n");
 for (i = 1; i < G->arcnum; i++)
 {
     printf("<< %d, %d >>   %d\n", edges[i].begin, edges[i].end, edges[i].weight);
 }

}

void Swapn(edge *edges,int i, int j)//交换权值 以及头和尾 
{  
 
 int temp;   
  
 temp = edges[i].begin;  
    edges[i].begin = edges[j].begin;
    edges[j].begin = temp;
    temp = edges[i].end;  
    edges[i].end = edges[j].end;
    edges[j].end = temp;
    temp = edges[i].weight;  
    edges[i].weight = edges[j].weight;
    edges[j].weight = temp;


void MiniSpanTree(MGraph *G)//生成最小生成树 
{
 int i, j, n, m;
 int k = 1;
    int parent[M];

 edge edges[M];
 
 for ( i = 1; i < G->vexnum; i++)
 {
  for (j = i + 1; j <= G->vexnum; j++)
  {
   if (G->arc[i][j].adj == 1)
   {
    edges[k].begin = i;
    edges[k].end = j;
    edges[k].weight = G->arc[i][j].weight;
       k++;
   }
   
  }
 }
        
    sort(edges, G);
    for (i = 1; i <= G->arcnum; i++)
 {
  parent[i] = 0;
 }
    printf("最小生成树为:\n");
 for (i = 1; i <= G->arcnum; i++)//核心部分 
 {
  n = Find(parent, edges[i].begin);
  m = Find(parent, edges[i].end);
  if (n != m)
  {
     parent[n] = m;
     printf("<< %d, %d >>   %d\n", edges[i].begin, edges[i].end, edges[i].weight);
  }
 }
}

int Find(int *parent, int f)//找尾 
{
 while ( parent[f] > 0)
 {
  f = parent[f];
 }
    return f;
}

int main(void)//主函数 
{
 MGraph *G;

 G = (MGraph*)malloc(sizeof(MGraph));
 if (G == NULL)
 {
  printf("memory allcation failed,goodbye");
  exit(1);
 }
    
 CreatGraph(G);
    MiniSpanTree(G);
   
 system("pause");
 return 0;



4 楼

多谢楼上的……
只是……C描述……
唉……痛苦……好多都是C描述的东西……偶这个该死的课是基于C++……

5 楼

哈哈,学点C++吧,否则没法了

6 楼

狂晕,我现在是学得头大

7 楼

先顶一下

8 楼

3楼的那个程序 哪能运行啊

我来回复

您尚未登录,请登录后再回复。点此登录或注册