弟弟的作业,让我做才发现做不好!一起来看看!(有代码)!最好能把你做的写出来!
oktay 2005-07-14 03:57:36 问题:
图的基本操作与实现
(1)自选存储结构,输入含n个顶点(用字符表示顶点)和e
条边的图G;
(2)求每个顶点的度,输出结果;
(3)判断图G是否是连通图,输出信息“YES”/“NO”;
(4)如果选用的存储结构是邻接矩阵,则用邻接矩阵的信息生
成图G的邻接表,即复制图G,然再执行操作(2);反之亦然
我的代码:
#include <iostream.h>
#include <stdlib.h>
typedef char VerT;
typedef char DataType;
const int MaxVertices = 100;
const int MaxWeight = 10000;
const int MaxQueueSize = 100;
#include "AdjMWGraph.h"
#include "CreatAdjMWGraph.h"
void Printchar(char item)
{
cout << item<<" ";
}
//主函数测试flag为0表示无向图,为1表示有向图
void main(void)
{
AdjMWGraph g;
char a[] = {'A','B','C','D','E'}; //测试图1
RowColWeight rcw[] = {{0,1,10},{0,4,20},{1,3,30},
{2,1,40},{2,3,50}}; //测试图1
//char a[] = {'A','B','C','D','E','F','G','H','I'}; //测试图2
//RowColWeight rcw[] = {{0,1,1},{0,2,1},{0,7,1},{0,4,1},
//{0,5,1},{2,3,1},{5,6,1}}; //测试图2
// char a[] = {'A'}; //测试图3
//RowColWeight rcw[] = {{0,0,0}}; //测试图3
int n = 0, e = 0,flag;
cout<<"请输入FLAG的值(0无向,1有向)"<<endl;
cout<<"flag = ";
cin>>flag;
cout<<"输入顶点的个数和边的条数:"<<endl;
cout<<"顶点的个数: ";
cin>>n;
cout<<"边的条数: ";
cin>>e;
cout<<endl;
CreatGraph(g, a, n, rcw, e,flag);
cout << "顶点个数为:" << g.NumOfVertices() << endl;
cout << "边的条数为:" << g.NumOfEdges() << endl;
cout<<endl;
g.countd(flag); //求各个顶点的度
cout << "深度优先搜索序列为:";
g.DepthFirstSearch(Printchar);
cout<<endl;
}
/*第三部分判断是否为连通图。图以邻接矩阵为存储结构,判断给定结点vi和任意结点vj之间是否有路径.
根据连通图的定义若有图为连通图.*/
int pathDFSM(MGraph *G,int i,int j)
{
int k;
visited[i]=TRUE;
for(k=0;k<G->n;k++)
//依次搜索vi的邻接点
if(G->edges[i][k]==1&&!visited[k])
if (k==j) return 1;
//有路径相通
cout<<"Yes"<<endl;
else return(pathDFSM(G,k,j);
return 0;
//无路径相通
cout<<"No"<<endl;
}//DFSM
/*第四部分:在邻接矩阵信息基础上生成邻接表。逐个扫描邻接矩阵的各个元素,如第i行第j列的元素
为1,则相应的邻接表的第i个单链表上增加一个j结点。*/
void transform(int adjarray[n][n],adjlist adj)
{
int i,j;
edgenode *p;
for(i=0;i<n;i++)
{
adj[i].data=i;
adj[i].link=NULL;
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(adjarray[i][j]==1)
{
p=(edgenode *)malloc(sizeof(edgenode));
p→adjvex=j;
p→next=adj[i].link;
adj[i].link=p;
}
}
}