数据结构:图的实现(输出有向图的邻接矩阵与出度和最大的点)
【问题描述】
需要分别基于邻接矩阵和邻接表来实现图ADT
需要实现图的各个基本操作
小明最近在学习数据结构中图的相关知识,他需要输出有向图的邻接矩阵并找出有向图中出度最大的点。你能帮他解决这个问题么?
【输入形式】
每一组第一行有两个数n、m表示n个顶点,m条有向边。
输入顶点信息,并用空格隔开,顶点信息以大写字母表示
接下来有m行,每行三个数u、v、w代表权值为w的一条由u到v的有向边
注意: 2<=n<=10,n<m<=10,w为正整数,输入保证没有自环
【输出形式】
输出矩阵:每条边发出的顶点对应行,进入的顶点对应列
输出的第一个字符为出度和最大的点所表示的字符,第二个为该点的出度的值,如果出度相同,则依据点的字符大小,输出字符大的点。
【样例输入】
4 3
A B C D
A B 1
B C 1
B D 1
【样例输出】
0 1 0 0
0 0 1 1
0 0 0 0
0 0 0 0
B 2
【实验代码提交及评分】
源代码请提交工程压缩包,压缩包内至少包含以下三个文件:
1)XXX.h:图ADT的定义和声明
2)XXX.h:图ADT的实现
3)XXXXX.cpp:主程序
【代码】
Graph.h
#include<iostream>
using namespace std;
#ifndef _Graph
#define _Graph
class Graph
{
private:
void operator = (const Graph&) {}
Graph(const Graph&) {}
public:
Graph() {}//构造函数
virtual ~Graph() {}//析构函数
virtual int n() =0;//顶点数目
virtual int e() =0;//边数目
virtual int first(int v) =0;//与顶点v关联的第一条边
virtual int next(int v,int w) =0;//与顶点v关联的在顶点w后的下一条边
virtual void clear()=0;//销毁一个图
virtual bool setEdge(int v1,int v2,int wght) =0;//设边权
virtual bool delEdge(int v1,int v2) =0;//删除边
virtual bool isEdge(int i,int j) =0;//判断是否有边
virtual int weight(int v1,int v2) =0;//v1-v2边的边权
virtual int getMark(int v) =0;//返回标记信号
virtual void setMark(int v,int val) =0;//标记数组中做标记
virtual void DFS(Graph *G,int v) =0;//深搜
};
#endif
Graphm.h
#include<iostream>
using namespace std;
#include"Graph.h"
#ifndef _Graphm
#define _Graphm
class Graphm:public Graph
{
private:
int numVertex,numEdge;
int **matrix;
int *mark;
public:
Graphm();
~Graphm();
void Init(int n);
int n();
int e();
int first(int v);
int next(int v,int w);
void clear();
bool setEdge(int v1,int v2,int wt);
bool delEdge(int v1,int v2);
bool isEdge(int i,int j);
int weight(int v1,int v2);
int getMark(int v);
void setMark(int v,int val);
void memset();//重置mark数组
void DFS(Graph *G,int v);
void print();//输出邻接矩阵
int chudu(int v);
};
#endif
Graphm.cpp
#include<iostream>
#include"Graphm.h"
#include<iomanip>
#define UNVISITED 0
#define VISITED 1
#define INF 1<<30
using namespace std;
Graphm::Graphm()
{
}
Graphm::~Graphm()
{
clear();
}
void Graphm::Init(int n)
{
numVertex=n;
numEdge=0;
mark=new int[n];
for(int i=0;i<numVertex;i++)
mark[i]=UNVISITED;
matrix=(int**) new int*[numVertex];
for(int i=0;i<numVertex;i++)
matrix[i]=new int[numVertex];
for(int i=0;i<numVertex;i++)
for(int j=0;j<numVertex;j++)
{
if(i==j) matrix[i][j]=0;
else matrix[i][j]=INF;
}
}
int Graphm::n()
{
return numVertex;
}
int Graphm::e()
{
return numEdge;
}
int Graphm::first(int v)
{
for(int i=0;i<numVertex;i++)
if(matrix[v][i]!=INF&&matrix[v][i]!=0) return i;
return numVertex;
}
int Graphm::next(int v,int w)
{
for(int i=w+1;i<numVertex;i++)
if(matrix[v][i]!=INF&&matrix[v][i]!=0) return i;
return numVertex;
}
void Graphm::clear()
{
delete [] mark;
mark=NULL;//释放后置空
for(int i=0;i<numVertex;i++)
delete [] matrix[i];
delete [] matrix;
matrix=NULL;//释放后置空
}
bool Graphm::setEdge(int v1,int v2,int wt)
{
if(wt<=0)
{
cout<<"Illegal weight value\n";
return false;
}
if(v1==v2||v1<0||v2<0||v1>=numVertex||v2>=numVertex)
{
cout<<"Illegal vertex\n";
return false;
}
if(matrix[v1][v2]==INF) numEdge++;
matrix[v1][v2]=wt;
return true;
}
bool Graphm::delEdge(int v1,int v2)
{
if(v1<0||v2<0||v1>=numVertex||v2>=numVertex||v1==v2)
{
cout<<"Illegal vertex\n";
return false;
}
if(matrix[v1][v2]!=INF) numEdge--;
matrix[v1][v2]=INF;
return true;
}
bool Graphm::isEdge(int i,int j)
{
if(i==j||matrix[i][j]==INF) return false;
return true;
}
int Graphm::weight(int v1,int v2)
{
if(v1<0||v2<0||v1>=numVertex||v2>=numVertex||v1==v2)
{
cout<<"Illegal vertex\n";
return INF;
}
return matrix[v1][v2];
}
int Graphm::getMark(int v)
{
return mark[v];
}
void Graphm::setMark(int v,int val)
{
mark[v]=val;
}
void Graphm::memset()
{
for(int i=0;i<numVertex;i++)
mark[i]=UNVISITED;
}
void Graphm::DFS(Graph* G,int v)
{
cout<<v<<' ';//previsit
G->setMark(v,VISITED);
for(int w=G->first(v);w<G->n();w=G->next(v,w))
{
if(G->getMark(w)==UNVISITED)
DFS(G,w);
}
}
void Graphm::print()
{
if(matrix==NULL)
{
cout<<"Empty graph\n";
return;
}
for(int i=0;i<numVertex;i++)
{
for(int j=0;j<numVertex;j++)
{
if(matrix[i][j]==INF) cout<<'0'<<' ';
else cout<<matrix[i][j]<<' ';
}
cout<<endl;
}
}
int Graphm::chudu(int v)
{
int num=0;
for(int j=0;j<numVertex;j++)
{
if(matrix[v][j]!=INF&&matrix[v][j]!=0) num++;
}
return num;
}
main.cpp
#include <iostream>
#include "Graphm.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv)
{
int vertex,edge;
Graphm G;
cin>>vertex>>edge;
G.Init(vertex);
string l;
char ll;
for(int i=0;i<vertex;i++)
{
cin>>ll;
l=l+ll;
}
for(int i=1;i<=edge;i++)
{
char ss,ee;
int s,e,w;
cin>>ss>>ee>>w;
s=l.find(ss);e=l.find(ee);
G.setEdge(s,e,w);
}
G.print();
int maxchudu=G.chudu(0);int maxdian=0;
for(int i=1;i<vertex;i++)
{
if(G.chudu(i)>maxchudu||(G.chudu(i)==maxchudu&&l[i]>l[maxdian]))
{
maxchudu=G.chudu(i);maxdian=i;
}
}
cout<<l[maxdian]<<' '<<maxchudu<<endl;
return 0;
}